Skip to content

Commit

Permalink
Oracledb discovery (signalfx#3633)
Browse files Browse the repository at this point in the history
* update bundled test and configs for oraclediscovery

* update bundled test and configs for oraclediscovery

* running bundled_test now evaluate metrics matching

* add working bundled_test

* update fail and partial messages for receiver config variables

* order of bundled configs matters

* make fmt and add more time

* lower durations, add in args for endpoint and service

* reduce time on image pull and add to windows bundle

* add to bundle_windows_test

* lower times on tests

* address feedback on yaml template and test using env var

* gotta make generate-metrics

* re-arrange bundled test

* add oracledb to the discovery readme

* make generate-metrics fmt

* address feedback

* Update internal/confmapprovider/discovery/README.md

Co-authored-by: Ryan Fitzpatrick <10867373+rmfitzpatrick@users.noreply.github.com>

* fix to re-check  and other attribute fields

* add new test data for bundled test

* add generated yaml

---------

Co-authored-by: greatestusername-splunk <83726369+greatestusername-splunk@users.noreply.github.com>
Co-authored-by: Ryan Fitzpatrick <10867373+rmfitzpatrick@users.noreply.github.com>
  • Loading branch information
3 people authored and Samiur Arif committed Sep 25, 2023
1 parent dcc4616 commit 7ed22cc
Show file tree
Hide file tree
Showing 13 changed files with 365 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#####################################################################################
# This file is generated by the Splunk Distribution of the OpenTelemetry Collector. #
# #
# It reflects the default configuration bundled in the Collector executable for use #
# in discovery mode (--discovery) and is provided for reference or customization. #
# Please note that any changes made to this file will need to be reconciled during #
# upgrades of the Collector. #
#####################################################################################
# oracledb:
# enabled: true
# rule:
# docker_observer: type == "container" and any([name, image, command], {# matches "(?i)oracle"}) and not (command matches "splunk.discovery")
# host_observer: type == "hostport" and command matches "(?i)oracle" and not (command matches "splunk.discovery")
# k8s_observer: type == "port" and pod.name matches "(?i)oracle"
# config:
# default:
# endpoint: splunk.discovery.default
# username: splunk.discovery.default
# password: splunk.discovery.default
# service: splunk.discovery.default
# status:
# metrics:
# successful:
# - strict: oracledb.cpu_time
# first_only: true
# log_record:
# severity_text: info
# body: oracledb receiver is working!
# statements:
# failed:
# - regexp: "connection refused"
# first_only: true
# log_record:
# severity_text: info
# append_pattern: true
# body: The container is not serving http connections.
# - regexp: "received goaway and there are no active streams"
# first_only: true
# log_record:
# severity_text: info
# append_pattern: true
# body: Unable to connect and scrape metrics.
# - regexp: "dial tcp: lookup"
# first_only: true
# log_record:
# severity_text: info
# append_pattern: true
# body: Unable to resolve oracledb tcp endpoint
# - regexp: 'error executing select .*: EOF'
# first_only: true
# log_record:
# severity_text: info
# append_pattern: true
# body: Unable to execute select from oracledb. Verify endpoint and user permissions.
# partial:
# - regexp: "listener does not currently know of service requested"
# first_only: true
# log_record:
# severity_text: info
# append_pattern: true
# body: >-
# Make sure your oracledb service is correctly specified using the
# `--set splunk.discovery.receivers.oracledb.config.service="<service>"` command or the
# `SPLUNK_DISCOVERY_RECEIVERS_oracledb_CONFIG_service="<service>"` environment variable.
# - regexp: 'invalid username/password'
# first_only: true
# log_record:
# severity_text: info
# append_pattern: true
# body: >-
# Make sure your user credentials are correctly specified using the
# `--set splunk.discovery.receivers.oracledb.config.username="<username>"` and
# `--set splunk.discovery.receivers.oracledb.config.password="<password>"` command or the
# `SPLUNK_DISCOVERY_RECEIVERS_oracledb_CONFIG_username="<username>"` and
# `SPLUNK_DISCOVERY_RECEIVERS_oracledb_CONFIG_password="<password>"` environment variables.
#
9 changes: 5 additions & 4 deletions internal/confmapprovider/discovery/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,10 +135,11 @@ By default, the discovery mode is provided with pre-made discovery config compon

The following components have bundled discovery configurations in the last Splunk OpenTelemetry Collector release:

I. Smart Agent receiver
* `collectd/mysql` monitor type ([Linux](./bundle/bundle.d/receivers/smartagent-collectd-mysql.discovery.yaml))
* `collectd/nginx` monitor type ([Linux](./bundle/bundle.d/receivers/smartagent-collectd-nginx.discovery.yaml))
* `postgresql` monitor type ([Linux and Windows](./bundle/bundle.d/receivers/smartagent-postgresql.discovery.yaml))
I. Receivers
* `oracledb` ([Linux and Windows](./bundle/bundle.d/receivers/oracledb.discovery.yaml))
* `smartagent` with `collectd/mysql` monitor type ([Linux](./bundle/bundle.d/receivers/smartagent-collectd-mysql.discovery.yaml))
* `smartagent` with `collectd/nginx` monitor type ([Linux](./bundle/bundle.d/receivers/smartagent-collectd-nginx.discovery.yaml))
* `smartagent` with `postgresql` monitor type ([Linux and Windows](./bundle/bundle.d/receivers/smartagent-postgresql.discovery.yaml))

II. Extensions
* `docker_observer` ([Linux and Windows](./bundle/bundle.d/extensions/docker-observer.discovery.yaml))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#####################################################################################
# Do not edit manually! #
# All changes must be made to associated .tmpl file before running 'make bundle.d'. #
#####################################################################################
oracledb:
enabled: true
rule:
docker_observer: type == "container" and any([name, image, command], {# matches "(?i)oracle"}) and not (command matches "splunk.discovery")
host_observer: type == "hostport" and command matches "(?i)oracle" and not (command matches "splunk.discovery")
k8s_observer: type == "port" and pod.name matches "(?i)oracle"
config:
default:
endpoint: splunk.discovery.default
username: splunk.discovery.default
password: splunk.discovery.default
service: splunk.discovery.default
status:
metrics:
successful:
- strict: oracledb.cpu_time
first_only: true
log_record:
severity_text: info
body: oracledb receiver is working!
statements:
failed:
- regexp: "connection refused"
first_only: true
log_record:
severity_text: info
append_pattern: true
body: The container is not serving http connections.
- regexp: "received goaway and there are no active streams"
first_only: true
log_record:
severity_text: info
append_pattern: true
body: Unable to connect and scrape metrics.
- regexp: "dial tcp: lookup"
first_only: true
log_record:
severity_text: info
append_pattern: true
body: Unable to resolve oracledb tcp endpoint
- regexp: 'error executing select .*: EOF'
first_only: true
log_record:
severity_text: info
append_pattern: true
body: Unable to execute select from oracledb. Verify endpoint and user permissions.
partial:
- regexp: "listener does not currently know of service requested"
first_only: true
log_record:
severity_text: info
append_pattern: true
body: >-
Make sure your oracledb service is correctly specified using the
`--set splunk.discovery.receivers.oracledb.config.service="<service>"` command or the
`SPLUNK_DISCOVERY_RECEIVERS_oracledb_CONFIG_service="<service>"` environment variable.
- regexp: 'invalid username/password'
first_only: true
log_record:
severity_text: info
append_pattern: true
body: >-
Make sure your user credentials are correctly specified using the
`--set splunk.discovery.receivers.oracledb.config.username="<username>"` and
`--set splunk.discovery.receivers.oracledb.config.password="<password>"` command or the
`SPLUNK_DISCOVERY_RECEIVERS_oracledb_CONFIG_username="<username>"` and
`SPLUNK_DISCOVERY_RECEIVERS_oracledb_CONFIG_password="<password>"` environment variables.
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
{{ receiver "oracledb" }}:
enabled: true
rule:
docker_observer: type == "container" and any([name, image, command], {# matches "(?i)oracle"}) and not (command matches "splunk.discovery")
host_observer: type == "hostport" and command matches "(?i)oracle" and not (command matches "splunk.discovery")
k8s_observer: type == "port" and pod.name matches "(?i)oracle"
config:
default:
endpoint: {{ defaultValue }}
username: {{ defaultValue }}
password: {{ defaultValue }}
service: {{ defaultValue }}
status:
metrics:
successful:
- strict: oracledb.cpu_time
first_only: true
log_record:
severity_text: info
body: oracledb receiver is working!
statements:
failed:
- regexp: "connection refused"
first_only: true
log_record:
severity_text: info
append_pattern: true
body: The container is not serving http connections.
- regexp: "received goaway and there are no active streams"
first_only: true
log_record:
severity_text: info
append_pattern: true
body: Unable to connect and scrape metrics.
- regexp: "dial tcp: lookup"
first_only: true
log_record:
severity_text: info
append_pattern: true
body: Unable to resolve oracledb tcp endpoint
- regexp: 'error executing select .*: EOF'
first_only: true
log_record:
severity_text: info
append_pattern: true
body: Unable to execute select from oracledb. Verify endpoint and user permissions.
partial:
- regexp: "listener does not currently know of service requested"
first_only: true
log_record:
severity_text: info
append_pattern: true
body: >-
Make sure your oracledb service is correctly specified using the
`--set {{ configProperty "service" "<service>" }}` command or the
`{{ configPropertyEnvVar "service" "<service>" }}` environment variable.
- regexp: 'invalid username/password'
first_only: true
log_record:
severity_text: info
append_pattern: true
body: >-
Make sure your user credentials are correctly specified using the
`--set {{ configProperty "username" "<username>" }}` and
`--set {{ configProperty "password" "<password>" }}` command or the
`{{ configPropertyEnvVar "username" "<username>" }}` and
`{{ configPropertyEnvVar "password" "<password>" }}` environment variables.

2 changes: 2 additions & 0 deletions internal/confmapprovider/discovery/bundle/bundle_gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
//go:generate discoverybundler -r -c -d ../../../../cmd/otelcol/config/collector/config.d.linux/receivers -t bundle.d/receivers/smartagent-collectd-mysql.discovery.yaml.tmpl
//go:generate discoverybundler -r -t bundle.d/receivers/smartagent-collectd-nginx.discovery.yaml.tmpl
//go:generate discoverybundler -r -c -d ../../../../cmd/otelcol/config/collector/config.d.linux/receivers -t bundle.d/receivers/smartagent-collectd-nginx.discovery.yaml.tmpl
//go:generate discoverybundler -r -t bundle.d/receivers/oracledb.discovery.yaml.tmpl
//go:generate discoverybundler -r -c -d ../../../../cmd/otelcol/config/collector/config.d.linux/receivers -t bundle.d/receivers/oracledb.discovery.yaml.tmpl

//go:generate discoverybundler -r -t bundle.d/extensions/docker-observer.discovery.yaml.tmpl
//go:generate discoverybundler -r -c -d ../../../../cmd/otelcol/config/collector/config.d.linux/extensions -t bundle.d/extensions/docker-observer.discovery.yaml.tmpl
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func TestBundleDir(t *testing.T) {
receivers, err := fs.Glob(BundledFS, "bundle.d/receivers/*.discovery.yaml")
require.NoError(t, err)
require.Equal(t, []string{
"bundle.d/receivers/oracledb.discovery.yaml",
"bundle.d/receivers/smartagent-collectd-mysql.discovery.yaml",
"bundle.d/receivers/smartagent-collectd-nginx.discovery.yaml",
"bundle.d/receivers/smartagent-postgresql.discovery.yaml",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,6 @@ import (
// build errors.
//
//go:embed bundle.d/extensions/*.discovery.yaml
//go:embed bundle.d/receivers/oracledb.discovery.yaml
//go:embed bundle.d/receivers/smartagent-postgresql.discovery.yaml
var BundledFS embed.FS
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func TestBundleDir(t *testing.T) {
receivers, err := fs.Glob(BundledFS, "bundle.d/receivers/*.discovery.yaml")
require.NoError(t, err)
require.Equal(t, []string{
"bundle.d/receivers/oracledb.discovery.yaml",
"bundle.d/receivers/smartagent-postgresql.discovery.yaml",
}, receivers)

Expand Down
61 changes: 61 additions & 0 deletions tests/receivers/oracledb/bundled_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// Copyright Splunk, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//go:build integration

package tests

import (
"fmt"
"runtime"
"testing"

"github.com/signalfx/splunk-otel-collector/tests/testutils"
)

func TestOracledbDockerObserver(t *testing.T) {
testutils.SkipIfNotContainerTest(t)
if runtime.GOOS == "darwin" {
t.Skip("unable to share sockets between mac and d4m vm: https://github.com/docker/for-mac/issues/483#issuecomment-758836836")
}

testutils.AssertAllMetricsReceived(t, "bundled.yaml", "otlp_exporter.yaml",
oracledb, []testutils.CollectorBuilder{
func(c testutils.Collector) testutils.Collector {
cc := c.(*testutils.CollectorContainer)
cc.Container = cc.Container.WithBinds("/var/run/docker.sock:/var/run/docker.sock:ro")
cc.Container = cc.Container.WillWaitForLogs("Discovering for next")
cc.Container = cc.Container.WithUser(fmt.Sprintf("999:%d", testutils.GetDockerGID(t)))
return cc
},
func(collector testutils.Collector) testutils.Collector {
return collector.WithEnv(map[string]string{
"ORACLEDB_URL": "oracle://otel:password@localhost:1521/XE",
"SPLUNK_DISCOVERY_DURATION": "10s",
// confirm that debug logging doesn't affect runtime
"SPLUNK_DISCOVERY_LOG_LEVEL": "debug",
"ORACLE_PASSWORD": "password",
}).WithArgs(
"--discovery",
"--set", "splunk.discovery.receivers.oracledb.config.username=otel",
"--set", "splunk.discovery.receivers.oracledb.config.password='${ORACLE_PASSWORD}'",
"--set", "splunk.discovery.receivers.oracledb.config.endpoint=localhost:1521",
"--set", "splunk.discovery.receivers.oracledb.config.service=XE",
"--set", `splunk.discovery.extensions.k8s_observer.enabled=false`,
"--set", `splunk.discovery.extensions.host_observer.enabled=false`,
)
},
},
)
}
2 changes: 1 addition & 1 deletion tests/receivers/oracledb/oracledb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import (
// account for startup time is to wait for the container to be healthy before continuing test.
var oracledb = []testutils.Container{testutils.NewContainer().WithContext(
path.Join(".", "testdata", "server"),
).WithName("oracledb").WithExposedPorts("1521:1521").WillWaitForHealth(15 * time.Minute)}
).WithName("oracledb").WithExposedPorts("1521:1521").WillWaitForHealth(5 * time.Minute)}

// This test ensures the collector can connect to an Oracle DB, and properly get metrics. It's not intended to
// test the receiver itself.
Expand Down
13 changes: 13 additions & 0 deletions tests/receivers/oracledb/testdata/otlp_exporter.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
exporters:
otlp:
endpoint: "${OTLP_ENDPOINT}"
tls:
insecure: true

service:
telemetry:
logs:
level: debug
pipelines:
metrics:
exporters: [otlp]
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ resource_metrics:
oracledb.instance.name: localhost:1521/XE
scope_metrics:
- instrumentation_scope:
attributes: {}
name: otelcol/oracledbreceiver
version: <VERSION_FROM_BUILD>
metrics:
Expand Down
Loading

0 comments on commit 7ed22cc

Please sign in to comment.