From 47dcf24071fdf4e93d53ec6a6c283b9f35fde89a Mon Sep 17 00:00:00 2001 From: rreddy Date: Mon, 3 Aug 2026 20:06:20 +0530 Subject: [PATCH 01/33] feat(nrdot-oracle): scaffold debian.yml/rhel.yml metadata and inputVars --- .../nrdot/oracle-otel/debian.yml | 75 ++++++++++++++++++ .../infrastructure/nrdot/oracle-otel/rhel.yml | 79 +++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml create mode 100644 recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml new file mode 100644 index 000000000..e561d7ef6 --- /dev/null +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml @@ -0,0 +1,75 @@ +# Visit our schema definition for additional information on this file format. +# https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition + +name: nrdot-collector-oracle +displayName: NRDOT Oracle Database (Debian/Ubuntu) +description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector on Debian/Ubuntu self-hosted environments +repository: https://github.com/newrelic/nrdot-collector-releases + +installTargets: + - type: host + os: linux + platformFamily: debian + - type: host + os: linux + platform: ubuntu + +keywords: + - Oracle + - Oracle Database + - NRDOT + - OpenTelemetry + - OTel + - Database + - Linux + - Debian + - Ubuntu + +processMatch: + - tnslsnr + +preInstall: + discoveryMode: + - targeted + info: | + To capture data from Oracle Database, we need to create/authorize a monitoring + identity (a database user). This requires SYS/SYSDBA access on the account + running this installation. + +inputVars: + - name: NR_CLI_ORACLE_CONFIG_PRESET + prompt: "NRDOT configuration - 1) Database only 2) Host + Database: " + default: "1" + - name: NR_CLI_ORACLE_CONTAINER_TYPE + prompt: "Oracle container type - 1) CDB (monitor all PDBs) 2) PDB (single PDB): " + default: "1" + - name: NR_CLI_ORACLE_PDB_NAME + prompt: "PDB name (mode 2 only; leave blank for CDB mode): " + - name: NR_CLI_ORACLE_HOST + prompt: "Oracle Database host (e.g. localhost): " + default: "localhost" + - name: NR_CLI_ORACLE_PORT + prompt: "Oracle listener port: " + default: "1521" + - name: NR_CLI_ORACLE_SYS_PASSWORD + prompt: "SYS password (used once to create the monitoring user and grant privileges): " + secret: true + - name: NR_CLI_ORACLE_LOGIN_NAME + prompt: "Monitoring username (CDB mode creates it as c##): " + default: "newrelic" + - name: NR_CLI_ORACLE_LOGIN_PASSWORD + prompt: "Password for the monitoring login (leave blank to auto-generate a random password): " + secret: true + - name: NR_CLI_ORACLE_SERVICE_NAME + prompt: "CDB or PDB service name for the collector connection: " + +validationNrql: "SELECT count(*) FROM Metric WHERE metricName LIKE 'oracledb.%' AND instrumentation.provider = 'opentelemetry' SINCE 10 minutes ago" + +successLinkConfig: + type: EXPLORER + +install: + version: "3" + silent: true + + tasks: {} diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml new file mode 100644 index 000000000..30bd2e59d --- /dev/null +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -0,0 +1,79 @@ +# Visit our schema definition for additional information on this file format. +# https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition + +name: nrdot-collector-oracle +displayName: NRDOT Oracle Database (RHEL/CentOS/OEL) +description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector on RHEL/CentOS/OEL self-hosted environments +repository: https://github.com/newrelic/nrdot-collector-releases + +installTargets: + - type: host + os: linux + platform: centos + - type: host + os: linux + platform: redhat + - type: host + os: linux + platform: oracle + +keywords: + - Oracle + - Oracle Database + - NRDOT + - OpenTelemetry + - OTel + - Database + - Linux + - CentOS + - RHEL + - OEL + +processMatch: + - tnslsnr + +preInstall: + discoveryMode: + - targeted + info: | + To capture data from Oracle Database, we need to create/authorize a monitoring + identity (a database user). This requires SYS/SYSDBA access on the account + running this installation. + +inputVars: + - name: NR_CLI_ORACLE_CONFIG_PRESET + prompt: "NRDOT configuration - 1) Database only 2) Host + Database: " + default: "1" + - name: NR_CLI_ORACLE_CONTAINER_TYPE + prompt: "Oracle container type - 1) CDB (monitor all PDBs) 2) PDB (single PDB): " + default: "1" + - name: NR_CLI_ORACLE_PDB_NAME + prompt: "PDB name (mode 2 only; leave blank for CDB mode): " + - name: NR_CLI_ORACLE_HOST + prompt: "Oracle Database host (e.g. localhost): " + default: "localhost" + - name: NR_CLI_ORACLE_PORT + prompt: "Oracle listener port: " + default: "1521" + - name: NR_CLI_ORACLE_SYS_PASSWORD + prompt: "SYS password (used once to create the monitoring user and grant privileges): " + secret: true + - name: NR_CLI_ORACLE_LOGIN_NAME + prompt: "Monitoring username (CDB mode creates it as c##): " + default: "newrelic" + - name: NR_CLI_ORACLE_LOGIN_PASSWORD + prompt: "Password for the monitoring login (leave blank to auto-generate a random password): " + secret: true + - name: NR_CLI_ORACLE_SERVICE_NAME + prompt: "CDB or PDB service name for the collector connection: " + +validationNrql: "SELECT count(*) FROM Metric WHERE metricName LIKE 'oracledb.%' AND instrumentation.provider = 'opentelemetry' SINCE 10 minutes ago" + +successLinkConfig: + type: EXPLORER + +install: + version: "3" + silent: true + + tasks: {} From 2d45e0fab7bb5cf5bd7e4969c9a04b3258104c8c Mon Sep 17 00:00:00 2001 From: rreddy Date: Mon, 3 Aug 2026 21:49:27 +0530 Subject: [PATCH 02/33] feat(nrdot-oracle): add rds-debian.yml/rds-rhel.yml metadata and inputVars --- .../nrdot/oracle-otel/rds-debian.yml | 67 +++++++++++++++++ .../nrdot/oracle-otel/rds-rhel.yml | 71 +++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml create mode 100644 recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml new file mode 100644 index 000000000..580c07932 --- /dev/null +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -0,0 +1,67 @@ +# Visit our schema definition for additional information on this file format. +# https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition + +name: nrdot-collector-oracle-rds +displayName: NRDOT Oracle Database (AWS RDS, Debian/Ubuntu collector host) +description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector against an AWS RDS Oracle instance, collector installed on Debian/Ubuntu +repository: https://github.com/newrelic/nrdot-collector-releases + +installTargets: + - type: host + os: linux + platformFamily: debian + - type: host + os: linux + platform: ubuntu + +keywords: + - Oracle + - Oracle Database + - RDS + - NRDOT + - OpenTelemetry + - OTel + - Database + - Linux + - Debian + - Ubuntu + +processMatch: [] + +preInstall: + discoveryMode: + - targeted + info: | + To capture data from your RDS Oracle Database, we need to create/authorize a + monitoring identity (a database user) using the RDS master user's credentials. + +inputVars: + - name: NR_CLI_ORACLE_HOST + prompt: "RDS Oracle endpoint: " + - name: NR_CLI_ORACLE_PORT + prompt: "Oracle listener port: " + default: "1521" + - name: NR_CLI_ORACLE_ADMIN_USER + prompt: "RDS master username (used once to create the monitoring user and grant privileges): " + - name: NR_CLI_ORACLE_ADMIN_PASSWORD + prompt: "RDS master password: " + secret: true + - name: NR_CLI_ORACLE_LOGIN_NAME + prompt: "Monitoring username: " + default: "newrelic" + - name: NR_CLI_ORACLE_LOGIN_PASSWORD + prompt: "Password for the monitoring login (leave blank to auto-generate a random password): " + secret: true + - name: NR_CLI_ORACLE_SERVICE_NAME + prompt: "RDS DB service name for the collector connection: " + +validationNrql: "SELECT count(*) FROM Metric WHERE metricName LIKE 'oracledb.%' AND instrumentation.provider = 'opentelemetry' SINCE 10 minutes ago" + +successLinkConfig: + type: EXPLORER + +install: + version: "3" + silent: true + + tasks: {} diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml new file mode 100644 index 000000000..df30718d7 --- /dev/null +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -0,0 +1,71 @@ +# Visit our schema definition for additional information on this file format. +# https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition + +name: nrdot-collector-oracle-rds +displayName: NRDOT Oracle Database (AWS RDS, RHEL/CentOS/OEL collector host) +description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector against an AWS RDS Oracle instance, collector installed on RHEL/CentOS/OEL +repository: https://github.com/newrelic/nrdot-collector-releases + +installTargets: + - type: host + os: linux + platform: centos + - type: host + os: linux + platform: redhat + - type: host + os: linux + platform: oracle + +keywords: + - Oracle + - Oracle Database + - RDS + - NRDOT + - OpenTelemetry + - OTel + - Database + - Linux + - CentOS + - RHEL + - OEL + +processMatch: [] + +preInstall: + discoveryMode: + - targeted + info: | + To capture data from your RDS Oracle Database, we need to create/authorize a + monitoring identity (a database user) using the RDS master user's credentials. + +inputVars: + - name: NR_CLI_ORACLE_HOST + prompt: "RDS Oracle endpoint: " + - name: NR_CLI_ORACLE_PORT + prompt: "Oracle listener port: " + default: "1521" + - name: NR_CLI_ORACLE_ADMIN_USER + prompt: "RDS master username (used once to create the monitoring user and grant privileges): " + - name: NR_CLI_ORACLE_ADMIN_PASSWORD + prompt: "RDS master password: " + secret: true + - name: NR_CLI_ORACLE_LOGIN_NAME + prompt: "Monitoring username: " + default: "newrelic" + - name: NR_CLI_ORACLE_LOGIN_PASSWORD + prompt: "Password for the monitoring login (leave blank to auto-generate a random password): " + secret: true + - name: NR_CLI_ORACLE_SERVICE_NAME + prompt: "RDS DB service name for the collector connection: " + +validationNrql: "SELECT count(*) FROM Metric WHERE metricName LIKE 'oracledb.%' AND instrumentation.provider = 'opentelemetry' SINCE 10 minutes ago" + +successLinkConfig: + type: EXPLORER + +install: + version: "3" + silent: true + + tasks: {} From da209763468aacd5a90456d7319382dc89236236 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 4 Aug 2026 15:49:13 +0530 Subject: [PATCH 03/33] add debian.yml/rhel.yml preflight tasks (root/curl/systemd check, CDB/PDB input validation, Oracle version gate) --- .../nrdot/oracle-otel/debian.yml | 78 ++++++++++++++++++- .../infrastructure/nrdot/oracle-otel/rhel.yml | 78 ++++++++++++++++++- 2 files changed, 154 insertions(+), 2 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml index e561d7ef6..50d949c7b 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml @@ -72,4 +72,80 @@ install: version: "3" silent: true - tasks: {} + vars: + IS_SYSTEMCTL: + sh: command -v systemctl | wc -l + + tasks: + write_recipe_metadata: + cmds: + - | + echo '{"Metadata":{"CapturedCliOutput":"true"}}' | tee {{.NR_CLI_OUTPUT}} > /dev/null + + assert_pre_req: + cmds: + - | + if [ "$(id -u)" != "0" ]; then + echo "This newrelic install must be run under sudo or root" >&2 + exit 131 + fi + - | + if ! command -v curl > /dev/null 2>&1; then + echo "curl is required to run the newrelic install. Please install curl and re-run the installation." >&2 + exit 16 + fi + - | + if [ "{{.IS_SYSTEMCTL}}" -eq 0 ]; then + echo "systemd is required for the nrdot-collector service configuration." >&2 + exit 131 + fi + + assert_container_type_inputs: + cmds: + - | + CONTAINER_TYPE="{{.NR_CLI_ORACLE_CONTAINER_TYPE}}" + PDB_NAME="{{.NR_CLI_ORACLE_PDB_NAME}}" + + case "$CONTAINER_TYPE" in + 1) ;; + 2) + if [ -z "$PDB_NAME" ]; then + echo "NR_CLI_ORACLE_PDB_NAME is required when NR_CLI_ORACLE_CONTAINER_TYPE is 2 (PDB)." >&2 + exit 1 + fi + ;; + *) + echo "NR_CLI_ORACLE_CONTAINER_TYPE must be 1 (CDB) or 2 (PDB)." >&2 + exit 1 + ;; + esac + + assert_oracle_version: + cmds: + - | + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + SYS_PASSWORD="{{.NR_CLI_ORACLE_SYS_PASSWORD}}" + + VERSION_OUTPUT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << 'SQL' + WHENEVER SQLERROR EXIT SQL.SQLCODE + SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON + SELECT version FROM v$instance; + EXIT; + SQL + ) + if [ $? -ne 0 ]; then + echo "Failed to connect to Oracle Database to check its version:" >&2 + echo "$VERSION_OUTPUT" >&2 + exit 1 + fi + + MAJOR_VERSION=$(echo "$VERSION_OUTPUT" | grep -oE '^[0-9]+' | head -1) + + if [ -z "$MAJOR_VERSION" ] || [ "$MAJOR_VERSION" -lt 19 ]; then + echo "Oracle Database version ${MAJOR_VERSION:-unknown} is not supported. Oracle Database 19c or later is required." >&2 + exit 1 + fi + + echo "Oracle Database major version ${MAJOR_VERSION} detected - supported." diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index 30bd2e59d..93fb45f8d 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -76,4 +76,80 @@ install: version: "3" silent: true - tasks: {} + vars: + IS_SYSTEMCTL: + sh: command -v systemctl | wc -l + + tasks: + write_recipe_metadata: + cmds: + - | + echo '{"Metadata":{"CapturedCliOutput":"true"}}' | tee {{.NR_CLI_OUTPUT}} > /dev/null + + assert_pre_req: + cmds: + - | + if [ "$(id -u)" != "0" ]; then + echo "This newrelic install must be run under sudo or root" >&2 + exit 131 + fi + - | + if ! command -v curl > /dev/null 2>&1; then + echo "curl is required to run the newrelic install. Please install curl and re-run the installation." >&2 + exit 16 + fi + - | + if [ "{{.IS_SYSTEMCTL}}" -eq 0 ]; then + echo "systemd is required for the nrdot-collector service configuration." >&2 + exit 131 + fi + + assert_container_type_inputs: + cmds: + - | + CONTAINER_TYPE="{{.NR_CLI_ORACLE_CONTAINER_TYPE}}" + PDB_NAME="{{.NR_CLI_ORACLE_PDB_NAME}}" + + case "$CONTAINER_TYPE" in + 1) ;; + 2) + if [ -z "$PDB_NAME" ]; then + echo "NR_CLI_ORACLE_PDB_NAME is required when NR_CLI_ORACLE_CONTAINER_TYPE is 2 (PDB)." >&2 + exit 1 + fi + ;; + *) + echo "NR_CLI_ORACLE_CONTAINER_TYPE must be 1 (CDB) or 2 (PDB)." >&2 + exit 1 + ;; + esac + + assert_oracle_version: + cmds: + - | + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + SYS_PASSWORD="{{.NR_CLI_ORACLE_SYS_PASSWORD}}" + + VERSION_OUTPUT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << 'SQL' + WHENEVER SQLERROR EXIT SQL.SQLCODE + SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON + SELECT version FROM v$instance; + EXIT; + SQL + ) + if [ $? -ne 0 ]; then + echo "Failed to connect to Oracle Database to check its version:" >&2 + echo "$VERSION_OUTPUT" >&2 + exit 1 + fi + + MAJOR_VERSION=$(echo "$VERSION_OUTPUT" | grep -oE '^[0-9]+' | head -1) + + if [ -z "$MAJOR_VERSION" ] || [ "$MAJOR_VERSION" -lt 19 ]; then + echo "Oracle Database version ${MAJOR_VERSION:-unknown} is not supported. Oracle Database 19c or later is required." >&2 + exit 1 + fi + + echo "Oracle Database major version ${MAJOR_VERSION} detected - supported." From c53bb31d3c5c2d6122dbdfa7c950b43a8e63ca79 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 4 Aug 2026 20:03:59 +0530 Subject: [PATCH 04/33] feat(nrdot-oracle): add rds-debian.yml/rds-rhel.yml preflight tasks --- .../nrdot/oracle-otel/rds-debian.yml | 59 ++++++++++++++++++- .../nrdot/oracle-otel/rds-rhel.yml | 59 ++++++++++++++++++- 2 files changed, 116 insertions(+), 2 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index 580c07932..77b44858e 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -64,4 +64,61 @@ install: version: "3" silent: true - tasks: {} + vars: + IS_SYSTEMCTL: + sh: command -v systemctl | wc -l + + tasks: + write_recipe_metadata: + cmds: + - | + echo '{"Metadata":{"CapturedCliOutput":"true"}}' | tee {{.NR_CLI_OUTPUT}} > /dev/null + + assert_pre_req: + cmds: + - | + if [ "$(id -u)" != "0" ]; then + echo "This newrelic install must be run under sudo or root" >&2 + exit 131 + fi + - | + if ! command -v curl > /dev/null 2>&1; then + echo "curl is required to run the newrelic install. Please install curl and re-run the installation." >&2 + exit 16 + fi + - | + if [ "{{.IS_SYSTEMCTL}}" -eq 0 ]; then + echo "systemd is required for the nrdot-collector service configuration." >&2 + exit 131 + fi + + assert_oracle_version: + cmds: + - | + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" + ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" + + VERSION_OUTPUT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << 'SQL' + WHENEVER SQLERROR EXIT SQL.SQLCODE + SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON + SELECT version FROM v$instance; + EXIT; + SQL + ) + if [ $? -ne 0 ]; then + echo "Failed to connect to the RDS Oracle Database to check its version:" >&2 + echo "$VERSION_OUTPUT" >&2 + exit 1 + fi + + MAJOR_VERSION=$(echo "$VERSION_OUTPUT" | grep -oE '^[0-9]+' | head -1) + + if [ -z "$MAJOR_VERSION" ] || [ "$MAJOR_VERSION" -lt 19 ]; then + echo "Oracle Database version ${MAJOR_VERSION:-unknown} is not supported. Oracle Database 19c or later is required." >&2 + exit 1 + fi + + echo "Oracle Database major version ${MAJOR_VERSION} detected - supported." diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index df30718d7..0ae8f5727 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -68,4 +68,61 @@ install: version: "3" silent: true - tasks: {} + vars: + IS_SYSTEMCTL: + sh: command -v systemctl | wc -l + + tasks: + write_recipe_metadata: + cmds: + - | + echo '{"Metadata":{"CapturedCliOutput":"true"}}' | tee {{.NR_CLI_OUTPUT}} > /dev/null + + assert_pre_req: + cmds: + - | + if [ "$(id -u)" != "0" ]; then + echo "This newrelic install must be run under sudo or root" >&2 + exit 131 + fi + - | + if ! command -v curl > /dev/null 2>&1; then + echo "curl is required to run the newrelic install. Please install curl and re-run the installation." >&2 + exit 16 + fi + - | + if [ "{{.IS_SYSTEMCTL}}" -eq 0 ]; then + echo "systemd is required for the nrdot-collector service configuration." >&2 + exit 131 + fi + + assert_oracle_version: + cmds: + - | + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" + ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" + + VERSION_OUTPUT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << 'SQL' + WHENEVER SQLERROR EXIT SQL.SQLCODE + SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON + SELECT version FROM v$instance; + EXIT; + SQL + ) + if [ $? -ne 0 ]; then + echo "Failed to connect to the RDS Oracle Database to check its version:" >&2 + echo "$VERSION_OUTPUT" >&2 + exit 1 + fi + + MAJOR_VERSION=$(echo "$VERSION_OUTPUT" | grep -oE '^[0-9]+' | head -1) + + if [ -z "$MAJOR_VERSION" ] || [ "$MAJOR_VERSION" -lt 19 ]; then + echo "Oracle Database version ${MAJOR_VERSION:-unknown} is not supported. Oracle Database 19c or later is required." >&2 + exit 1 + fi + + echo "Oracle Database major version ${MAJOR_VERSION} detected - supported." From ebc6af5afefe1fd7042cb3177ba1b9192ea14c79 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 4 Aug 2026 20:19:21 +0530 Subject: [PATCH 05/33] feat(nrdot-oracle): add debian.yml/rhel.yml install_nrdot task --- .../nrdot/oracle-otel/debian.yml | 54 +++++++++++++++++++ .../infrastructure/nrdot/oracle-otel/rhel.yml | 54 +++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml index 50d949c7b..73a86d58c 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml @@ -149,3 +149,57 @@ install: fi echo "Oracle Database major version ${MAJOR_VERSION} detected - supported." + + install_nrdot: + cmds: + - | + COLLECTOR_DISTRO="nrdot-collector" + + if dpkg -l | grep -q "^ii.*${COLLECTOR_DISTRO} "; then + echo "NRDOT Collector is already installed." + echo "" + echo "Please follow the steps below to complete the setup:" + echo "" + echo " 1. Create oracle-config.yaml" + echo " if not present. Refer to:" + echo " https://docs.newrelic.com/docs/opentelemetry/database/otel-oracledb/" + echo "" + echo " 2. Make sure the monitoring user is created" + echo " and has the required permissions granted." + echo "" + echo " 3. After making the above changes, restart the NRDOT Collector:" + echo " sudo systemctl restart nrdot-collector" + echo "" + exit 131 + fi + + COLLECTOR_VERSION=$(curl -sf "https://api.github.com/repos/newrelic/nrdot-collector-releases/releases/latest" | grep '"tag_name":' | awk -F'"' '{print $4}') + if [ -z "$COLLECTOR_VERSION" ]; then + echo "Failed to fetch the latest release version from GitHub. Please check your internet connection." >&2 + exit 1 + fi + + if [ "$(uname -m)" = "aarch64" ]; then + ARCH="arm64" + else + ARCH="amd64" + fi + + DOWNLOAD_URL="https://github.com/newrelic/nrdot-collector-releases/releases/download/${COLLECTOR_VERSION}/${COLLECTOR_DISTRO}_${COLLECTOR_VERSION}_linux_${ARCH}.deb" + echo "Installing ${COLLECTOR_DISTRO} version: ${COLLECTOR_VERSION}" + echo "Downloading from: ${DOWNLOAD_URL}" + + curl -L --output /tmp/nrdot-collector.deb "$DOWNLOAD_URL" + if [ $? -ne 0 ]; then + echo "Failed to download the nrdot-collector package." >&2 + exit 1 + fi + + dpkg -i /tmp/nrdot-collector.deb + if [ $? -ne 0 ]; then + echo "Failed to install the nrdot-collector package." >&2 + exit 1 + fi + + rm -f /tmp/nrdot-collector.deb + echo "${COLLECTOR_DISTRO} installed successfully." diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index 93fb45f8d..ed8295fcf 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -153,3 +153,57 @@ install: fi echo "Oracle Database major version ${MAJOR_VERSION} detected - supported." + + install_nrdot: + cmds: + - | + COLLECTOR_DISTRO="nrdot-collector" + + if rpm -q "$COLLECTOR_DISTRO" > /dev/null 2>&1; then + echo "NRDOT Collector is already installed." + echo "" + echo "Please follow the steps below to complete the setup:" + echo "" + echo " 1. Create oracle-config.yaml" + echo " if not present. Refer to:" + echo " https://docs.newrelic.com/docs/opentelemetry/database/otel-oracledb/" + echo "" + echo " 2. Make sure the monitoring user is created" + echo " and has the required permissions granted." + echo "" + echo " 3. After making the above changes, restart the NRDOT Collector:" + echo " sudo systemctl restart nrdot-collector" + echo "" + exit 131 + fi + + COLLECTOR_VERSION=$(curl -sf "https://api.github.com/repos/newrelic/nrdot-collector-releases/releases/latest" | grep '"tag_name":' | awk -F'"' '{print $4}') + if [ -z "$COLLECTOR_VERSION" ]; then + echo "Failed to fetch the latest release version from GitHub. Please check your internet connection." >&2 + exit 1 + fi + + if [ "$(uname -m)" = "aarch64" ]; then + ARCH="arm64" + else + ARCH="x86_64" + fi + + DOWNLOAD_URL="https://github.com/newrelic/nrdot-collector-releases/releases/download/${COLLECTOR_VERSION}/${COLLECTOR_DISTRO}_${COLLECTOR_VERSION}_linux_${ARCH}.rpm" + echo "Installing ${COLLECTOR_DISTRO} version: ${COLLECTOR_VERSION}" + echo "Downloading from: ${DOWNLOAD_URL}" + + curl -L --output /tmp/nrdot-collector.rpm "$DOWNLOAD_URL" + if [ $? -ne 0 ]; then + echo "Failed to download the nrdot-collector package." >&2 + exit 1 + fi + + rpm -ivh /tmp/nrdot-collector.rpm + if [ $? -ne 0 ]; then + echo "Failed to install the nrdot-collector package." >&2 + exit 1 + fi + + rm -f /tmp/nrdot-collector.rpm + echo "${COLLECTOR_DISTRO} installed successfully." From b56386986f0dcbfb202f9f9b58a5463cc64ed960 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 4 Aug 2026 20:28:03 +0530 Subject: [PATCH 06/33] feat(nrdot-oracle): add rds-debian.yml/rds-rhel.yml install_nrdot task --- .../nrdot/oracle-otel/rds-debian.yml | 54 +++++++++++++++++++ .../nrdot/oracle-otel/rds-rhel.yml | 54 +++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index 77b44858e..0a463cde8 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -122,3 +122,57 @@ install: fi echo "Oracle Database major version ${MAJOR_VERSION} detected - supported." + + install_nrdot: + cmds: + - | + COLLECTOR_DISTRO="nrdot-collector" + + if dpkg -l | grep -q "^ii.*${COLLECTOR_DISTRO} "; then + echo "NRDOT Collector is already installed." + echo "" + echo "Please follow the steps below to complete the setup:" + echo "" + echo " 1. Create oracle-config.yaml" + echo " if not present. Refer to:" + echo " https://docs.newrelic.com/docs/opentelemetry/database/otel-oracledb/" + echo "" + echo " 2. Make sure the monitoring user is created" + echo " and has the required permissions granted." + echo "" + echo " 3. After making the above changes, restart the NRDOT Collector:" + echo " sudo systemctl restart nrdot-collector" + echo "" + exit 131 + fi + + COLLECTOR_VERSION=$(curl -sf "https://api.github.com/repos/newrelic/nrdot-collector-releases/releases/latest" | grep '"tag_name":' | awk -F'"' '{print $4}') + if [ -z "$COLLECTOR_VERSION" ]; then + echo "Failed to fetch the latest release version from GitHub. Please check your internet connection." >&2 + exit 1 + fi + + if [ "$(uname -m)" = "aarch64" ]; then + ARCH="arm64" + else + ARCH="amd64" + fi + + DOWNLOAD_URL="https://github.com/newrelic/nrdot-collector-releases/releases/download/${COLLECTOR_VERSION}/${COLLECTOR_DISTRO}_${COLLECTOR_VERSION}_linux_${ARCH}.deb" + echo "Installing ${COLLECTOR_DISTRO} version: ${COLLECTOR_VERSION}" + echo "Downloading from: ${DOWNLOAD_URL}" + + curl -L --output /tmp/nrdot-collector.deb "$DOWNLOAD_URL" + if [ $? -ne 0 ]; then + echo "Failed to download the nrdot-collector package." >&2 + exit 1 + fi + + dpkg -i /tmp/nrdot-collector.deb + if [ $? -ne 0 ]; then + echo "Failed to install the nrdot-collector package." >&2 + exit 1 + fi + + rm -f /tmp/nrdot-collector.deb + echo "${COLLECTOR_DISTRO} installed successfully." diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index 0ae8f5727..592d886b4 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -126,3 +126,57 @@ install: fi echo "Oracle Database major version ${MAJOR_VERSION} detected - supported." + + install_nrdot: + cmds: + - | + COLLECTOR_DISTRO="nrdot-collector" + + if rpm -q "$COLLECTOR_DISTRO" > /dev/null 2>&1; then + echo "NRDOT Collector is already installed." + echo "" + echo "Please follow the steps below to complete the setup:" + echo "" + echo " 1. Create oracle-config.yaml" + echo " if not present. Refer to:" + echo " https://docs.newrelic.com/docs/opentelemetry/database/otel-oracledb/" + echo "" + echo " 2. Make sure the monitoring user is created" + echo " and has the required permissions granted." + echo "" + echo " 3. After making the above changes, restart the NRDOT Collector:" + echo " sudo systemctl restart nrdot-collector" + echo "" + exit 131 + fi + + COLLECTOR_VERSION=$(curl -sf "https://api.github.com/repos/newrelic/nrdot-collector-releases/releases/latest" | grep '"tag_name":' | awk -F'"' '{print $4}') + if [ -z "$COLLECTOR_VERSION" ]; then + echo "Failed to fetch the latest release version from GitHub. Please check your internet connection." >&2 + exit 1 + fi + + if [ "$(uname -m)" = "aarch64" ]; then + ARCH="arm64" + else + ARCH="x86_64" + fi + + DOWNLOAD_URL="https://github.com/newrelic/nrdot-collector-releases/releases/download/${COLLECTOR_VERSION}/${COLLECTOR_DISTRO}_${COLLECTOR_VERSION}_linux_${ARCH}.rpm" + echo "Installing ${COLLECTOR_DISTRO} version: ${COLLECTOR_VERSION}" + echo "Downloading from: ${DOWNLOAD_URL}" + + curl -L --output /tmp/nrdot-collector.rpm "$DOWNLOAD_URL" + if [ $? -ne 0 ]; then + echo "Failed to download the nrdot-collector package." >&2 + exit 1 + fi + + rpm -ivh /tmp/nrdot-collector.rpm + if [ $? -ne 0 ]; then + echo "Failed to install the nrdot-collector package." >&2 + exit 1 + fi + + rm -f /tmp/nrdot-collector.rpm + echo "${COLLECTOR_DISTRO} installed successfully." From 42c9eb24b91a30dbe23a03ba517c1b43958f4a06 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 4 Aug 2026 20:37:38 +0530 Subject: [PATCH 07/33] feat(nrdot-oracle): add debian.yml/rhel.yml configure_database_user task (CDB and PDB modes) --- .../nrdot/oracle-otel/debian.yml | 99 +++++++++++++++++++ .../infrastructure/nrdot/oracle-otel/rhel.yml | 99 +++++++++++++++++++ 2 files changed, 198 insertions(+) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml index 73a86d58c..247317964 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml @@ -203,3 +203,102 @@ install: rm -f /tmp/nrdot-collector.deb echo "${COLLECTOR_DISTRO} installed successfully." + + configure_database_user: + cmds: + - | + CONTAINER_TYPE="{{.NR_CLI_ORACLE_CONTAINER_TYPE}}" + PDB_NAME="{{.NR_CLI_ORACLE_PDB_NAME}}" + LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + SYS_PASSWORD="{{.NR_CLI_ORACLE_SYS_PASSWORD}}" + PW_FILE="/tmp/nr-oracle-newrelic-pw.tmp" + + if [ -z "{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" ]; then + NR_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24) + else + NR_PASSWORD="{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" + fi + printf '%s' "$NR_PASSWORD" > "$PW_FILE" + chmod 600 "$PW_FILE" + + if [ "$CONTAINER_TYPE" = "1" ]; then + RESULT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << SQL 2>&1 + WHENEVER SQLERROR EXIT SQL.SQLCODE + ALTER SESSION SET CONTAINER = CDB\$ROOT; + CREATE USER c##${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}" CONTAINER=ALL; + GRANT CREATE SESSION TO c##${LOGIN_NAME} CONTAINER=ALL; + ALTER USER c##${LOGIN_NAME} SET CONTAINER_DATA=ALL CONTAINER=CURRENT; + GRANT SELECT ON V_\$INSTANCE TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$DATABASE TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$CONTAINERS TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$DATAFILE TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SYSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$CON_SYSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SYSMETRIC TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$CON_SYSMETRIC TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SESSION TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$RESOURCE_LIMIT TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$OSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SGAINFO TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$ROWCACHE TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$PARAMETER TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON CDB_TABLESPACE_USAGE_METRICS TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON CDB_TABLESPACES TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON DBA_DATA_FILES TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON DBA_FREE_SPACE TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON DBA_RECYCLEBIN TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SQL TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SQL_PLAN TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$LOCK TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SESSION_EVENT TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON DBA_PROCEDURES TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON DBA_OBJECTS TO c##${LOGIN_NAME} CONTAINER=ALL; + EXIT; + SQL + ) + else + RESULT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << SQL 2>&1 + WHENEVER SQLERROR EXIT SQL.SQLCODE + ALTER SESSION SET CONTAINER = "${PDB_NAME}"; + CREATE USER ${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}"; + GRANT CREATE SESSION TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$INSTANCE TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$DATABASE TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$CONTAINERS TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$DATAFILE TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SYSSTAT TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SYSMETRIC TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SESSION TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$RESOURCE_LIMIT TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$OSSTAT TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SGAINFO TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$ROWCACHE TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$PARAMETER TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_TABLESPACE_USAGE_METRICS TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_TABLESPACES TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_DATA_FILES TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_FREE_SPACE TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_RECYCLEBIN TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SQL TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SQL_PLAN TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$LOCK TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SESSION_EVENT TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_PROCEDURES TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_OBJECTS TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$PDBS TO ${LOGIN_NAME}; + EXIT; + SQL + ) + fi + + if [ $? -ne 0 ]; then + echo "SQL script failed:" >&2 + echo "$RESULT" >&2 + exit 1 + fi + echo "$RESULT" + + echo "Oracle Database monitoring identity configured successfully." diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index ed8295fcf..8ce04e171 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -207,3 +207,102 @@ install: rm -f /tmp/nrdot-collector.rpm echo "${COLLECTOR_DISTRO} installed successfully." + + configure_database_user: + cmds: + - | + CONTAINER_TYPE="{{.NR_CLI_ORACLE_CONTAINER_TYPE}}" + PDB_NAME="{{.NR_CLI_ORACLE_PDB_NAME}}" + LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + SYS_PASSWORD="{{.NR_CLI_ORACLE_SYS_PASSWORD}}" + PW_FILE="/tmp/nr-oracle-newrelic-pw.tmp" + + if [ -z "{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" ]; then + NR_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24) + else + NR_PASSWORD="{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" + fi + printf '%s' "$NR_PASSWORD" > "$PW_FILE" + chmod 600 "$PW_FILE" + + if [ "$CONTAINER_TYPE" = "1" ]; then + RESULT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << SQL 2>&1 + WHENEVER SQLERROR EXIT SQL.SQLCODE + ALTER SESSION SET CONTAINER = CDB\$ROOT; + CREATE USER c##${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}" CONTAINER=ALL; + GRANT CREATE SESSION TO c##${LOGIN_NAME} CONTAINER=ALL; + ALTER USER c##${LOGIN_NAME} SET CONTAINER_DATA=ALL CONTAINER=CURRENT; + GRANT SELECT ON V_\$INSTANCE TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$DATABASE TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$CONTAINERS TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$DATAFILE TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SYSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$CON_SYSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SYSMETRIC TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$CON_SYSMETRIC TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SESSION TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$RESOURCE_LIMIT TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$OSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SGAINFO TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$ROWCACHE TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$PARAMETER TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON CDB_TABLESPACE_USAGE_METRICS TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON CDB_TABLESPACES TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON DBA_DATA_FILES TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON DBA_FREE_SPACE TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON DBA_RECYCLEBIN TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SQL TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SQL_PLAN TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$LOCK TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON V_\$SESSION_EVENT TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON DBA_PROCEDURES TO c##${LOGIN_NAME} CONTAINER=ALL; + GRANT SELECT ON DBA_OBJECTS TO c##${LOGIN_NAME} CONTAINER=ALL; + EXIT; + SQL + ) + else + RESULT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << SQL 2>&1 + WHENEVER SQLERROR EXIT SQL.SQLCODE + ALTER SESSION SET CONTAINER = "${PDB_NAME}"; + CREATE USER ${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}"; + GRANT CREATE SESSION TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$INSTANCE TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$DATABASE TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$CONTAINERS TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$DATAFILE TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SYSSTAT TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SYSMETRIC TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SESSION TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$RESOURCE_LIMIT TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$OSSTAT TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SGAINFO TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$ROWCACHE TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$PARAMETER TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_TABLESPACE_USAGE_METRICS TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_TABLESPACES TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_DATA_FILES TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_FREE_SPACE TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_RECYCLEBIN TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SQL TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SQL_PLAN TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$LOCK TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$SESSION_EVENT TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_PROCEDURES TO ${LOGIN_NAME}; + GRANT SELECT ON DBA_OBJECTS TO ${LOGIN_NAME}; + GRANT SELECT ON V_\$PDBS TO ${LOGIN_NAME}; + EXIT; + SQL + ) + fi + + if [ $? -ne 0 ]; then + echo "SQL script failed:" >&2 + echo "$RESULT" >&2 + exit 1 + fi + echo "$RESULT" + + echo "Oracle Database monitoring identity configured successfully." From 728c0558b6349760eecd96f1313012ae562e7760 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 4 Aug 2026 20:45:27 +0530 Subject: [PATCH 08/33] feat(nrdot-oracle): add rds-debian.yml/rds-rhel.yml configure_database_user task (rdsadmin grants) --- .../nrdot/oracle-otel/rds-debian.yml | 68 +++++++++++++++++++ .../nrdot/oracle-otel/rds-rhel.yml | 68 +++++++++++++++++++ 2 files changed, 136 insertions(+) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index 0a463cde8..53a3d12ba 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -176,3 +176,71 @@ install: rm -f /tmp/nrdot-collector.deb echo "${COLLECTOR_DISTRO} installed successfully." + + configure_database_user: + cmds: + - | + LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" + LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" + ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" + PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" + + if [ -z "{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" ]; then + NR_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24) + else + NR_PASSWORD="{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" + fi + printf '%s' "$NR_PASSWORD" > "$PW_FILE" + chmod 600 "$PW_FILE" + + RESULT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << SQL 2>&1 + WHENEVER SQLERROR EXIT SQL.SQLCODE + CREATE USER ${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}"; + GRANT CONNECT TO ${LOGIN_NAME}; + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SYSMETRIC', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CON_SYSMETRIC', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CONTAINERS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SESSION', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SESSION_EVENT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SYSSTAT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CON_SYSSTAT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$OSSTAT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SGAINFO', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQL', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQLSTATS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQL_PLAN', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$PARAMETER', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$ROWCACHE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$RESOURCE_LIMIT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$LOCK', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$DATABASE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$INSTANCE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$DATAFILE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$PDBS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_DATA_FILES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_FREE_SPACE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_RECYCLEBIN', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACE_USAGE_METRICS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_PROCEDURES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_OBJECTS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_TABLESPACE_USAGE_METRICS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_TABLESPACES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_SERVICES', '${LOGIN_UPPER}', 'SELECT', false); + GRANT CREATE SESSION TO ${LOGIN_UPPER}; + EXIT; + SQL + ) + + if [ $? -ne 0 ]; then + echo "SQL script failed:" >&2 + echo "$RESULT" >&2 + exit 1 + fi + echo "$RESULT" + + echo "RDS Oracle Database monitoring identity configured successfully." diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index 592d886b4..1e777a730 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -180,3 +180,71 @@ install: rm -f /tmp/nrdot-collector.rpm echo "${COLLECTOR_DISTRO} installed successfully." + + configure_database_user: + cmds: + - | + LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" + LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" + ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" + PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" + + if [ -z "{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" ]; then + NR_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24) + else + NR_PASSWORD="{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" + fi + printf '%s' "$NR_PASSWORD" > "$PW_FILE" + chmod 600 "$PW_FILE" + + RESULT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << SQL 2>&1 + WHENEVER SQLERROR EXIT SQL.SQLCODE + CREATE USER ${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}"; + GRANT CONNECT TO ${LOGIN_NAME}; + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SYSMETRIC', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CON_SYSMETRIC', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CONTAINERS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SESSION', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SESSION_EVENT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SYSSTAT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CON_SYSSTAT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$OSSTAT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SGAINFO', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQL', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQLSTATS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQL_PLAN', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$PARAMETER', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$ROWCACHE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$RESOURCE_LIMIT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$LOCK', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$DATABASE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$INSTANCE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$DATAFILE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$PDBS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_DATA_FILES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_FREE_SPACE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_RECYCLEBIN', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACE_USAGE_METRICS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_PROCEDURES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_OBJECTS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_TABLESPACE_USAGE_METRICS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_TABLESPACES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_SERVICES', '${LOGIN_UPPER}', 'SELECT', false); + GRANT CREATE SESSION TO ${LOGIN_UPPER}; + EXIT; + SQL + ) + + if [ $? -ne 0 ]; then + echo "SQL script failed:" >&2 + echo "$RESULT" >&2 + exit 1 + fi + echo "$RESULT" + + echo "RDS Oracle Database monitoring identity configured successfully." From b30d2099aa0c6e727c20bff89456b79bad1e92f6 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 4 Aug 2026 21:09:12 +0530 Subject: [PATCH 09/33] feat(nrdot-oracle): add debian.yml/rhel.yml create_collector_config task (Database-only/Host+Database presets) --- .../nrdot/oracle-otel/debian.yml | 660 ++++++++++++++++++ .../infrastructure/nrdot/oracle-otel/rhel.yml | 660 ++++++++++++++++++ 2 files changed, 1320 insertions(+) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml index 247317964..da5212ac3 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml @@ -302,3 +302,663 @@ install: echo "$RESULT" echo "Oracle Database monitoring identity configured successfully." + + create_collector_config: + cmds: + - | + PRESET="{{.NR_CLI_ORACLE_CONFIG_PRESET}}" + CONTAINER_TYPE="{{.NR_CLI_ORACLE_CONTAINER_TYPE}}" + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" + REGION="{{.NEW_RELIC_REGION}}" + LICENSE_KEY="{{.NEW_RELIC_LICENSE_KEY}}" + CONFIG_DIR="/etc/nrdot-collector" + CONFIG_PATH="${CONFIG_DIR}/oracle-config.yaml" + ENV_FILE="${CONFIG_DIR}/nrdot-collector.conf" + PW_FILE="/tmp/nr-oracle-newrelic-pw.tmp" + + mkdir -p "$CONFIG_DIR" + + NR_PASSWORD=$(cat "$PW_FILE") + + if [ "$CONTAINER_TYPE" = "1" ]; then + DB_USERNAME="c##${LOGIN_NAME}" + else + DB_USERNAME="${LOGIN_NAME}" + fi + + case "$REGION" in + staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net" ;; + EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net" ;; + JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net" ;; + *) OTLP_ENDPOINT="https://otlp.nr-data.net" ;; + esac + + if [ "$PRESET" = "2" ]; then + cat > "$CONFIG_PATH" << EOF + extensions: + health_check: + + receivers: + otlp: + protocols: + grpc: + http: + + hostmetrics: + collection_interval: 60s + scrapers: + cpu: + metrics: + system.cpu.time: + enabled: false + system.cpu.utilization: + enabled: true + load: + memory: + metrics: + system.memory.utilization: + enabled: true + paging: + metrics: + system.paging.utilization: + enabled: false + system.paging.faults: + enabled: false + filesystem: + metrics: + system.filesystem.utilization: + enabled: true + disk: + metrics: + system.disk.merged: + enabled: false + system.disk.pending_operations: + enabled: false + system.disk.weighted_io_time: + enabled: false + network: + metrics: + system.network.connections: + enabled: false + + filelog: + include: + - /var/log/alternatives.log + - /var/log/cloud-init.log + - /var/log/auth.log + - /var/log/dpkg.log + - /var/log/syslog + - /var/log/messages + - /var/log/secure + - /var/log/yum.log + + nroracledb: + endpoint: "${HOST}:${PORT}" + username: "${DB_USERNAME}" + password: "${NR_PASSWORD}" + service: "${SERVICE_NAME}" + collection_interval: 10s + events: + db.server.query_sample: + enabled: true + db.server.top_query: + enabled: true + db.server.session.wait_sample: + enabled: true + top_query_collection: + max_query_sample_count: 1000 + top_query_count: 200 + collection_interval: 60s + allowed_comment_keys: + - nr_service_guid + query_sample_collection: + max_rows_per_query: 100 + allowed_comment_keys: + - nr_service_guid + session_wait_event_collection: + max_rows_per_query: 100 + metrics: + EOF + else + cat > "$CONFIG_PATH" << EOF + receivers: + nroracledb: + endpoint: "${HOST}:${PORT}" + username: "${DB_USERNAME}" + password: "${NR_PASSWORD}" + service: "${SERVICE_NAME}" + collection_interval: 10s + events: + db.server.query_sample: + enabled: true + db.server.top_query: + enabled: true + db.server.session.wait_sample: + enabled: true + top_query_collection: + max_query_sample_count: 1000 + top_query_count: 200 + collection_interval: 60s + allowed_comment_keys: + - nr_service_guid + query_sample_collection: + max_rows_per_query: 100 + allowed_comment_keys: + - nr_service_guid + session_wait_event_collection: + max_rows_per_query: 100 + metrics: + EOF + fi + + cat >> "$CONFIG_PATH" << 'EOF' + oracledb.cpu_time: + enabled: true + attributes: + - oracle.db.pdb + oracledb.database.cpu.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.host.cpu.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.system.cpu.load: + enabled: true + oracledb.executions: + enabled: true + attributes: + - oracle.db.pdb + oracledb.execution.utilization: + enabled: true + attributes: + - oracledb.parse.type + - oracle.db.pdb + oracledb.parse_calls: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parse.rate: + enabled: true + attributes: + - oracledb.parse.result + - oracle.db.pdb + oracledb.parse.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.hard_parses: + enabled: true + attributes: + - oracle.db.pdb + oracledb.logical_reads: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_reads: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_reads_direct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_writes: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_writes_direct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_read_io_requests: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_write_io_requests: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_io.cache_writes: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_io.requests: + enabled: true + attributes: + - disk.io.direction + - disk.io.block_size + - oracle.db.pdb + oracledb.physical_io.transferred: + enabled: true + attributes: + - disk.io.direction + - disk.io.type + - oracle.db.pdb + oracledb.sqlnet.io.transferred: + enabled: true + attributes: + - network.io.direction + - destination.type + - oracle.db.pdb + oracledb.consistent_gets: + enabled: true + attributes: + - oracle.db.pdb + oracledb.db_block_gets: + enabled: true + attributes: + - oracle.db.pdb + oracledb.buffer_cache.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.library_cache.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.data_dictionary.hit_ratio: + enabled: true + oracledb.shared_pool.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.pga_memory: + enabled: true + attributes: + - oracle.db.pdb + oracledb.sga.limit: + enabled: true + oracledb.sga.usage: + enabled: true + attributes: + - oracledb.sga.component.name + oracledb.database.wait.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.dml_locks.limit: + enabled: true + oracledb.dml_locks.usage: + enabled: true + oracledb.enqueue_locks.limit: + enabled: true + oracledb.enqueue_locks.usage: + enabled: true + oracledb.enqueue_resources.limit: + enabled: true + oracledb.enqueue_resources.usage: + enabled: true + oracledb.enqueue_deadlocks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.exchange_deadlocks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.processes.limit: + enabled: true + oracledb.processes.usage: + enabled: true + oracledb.sessions.limit: + enabled: true + oracledb.sessions.usage: + enabled: true + attributes: + - session_type + - session_status + - oracle.db.pdb + oracledb.logons: + enabled: true + attributes: + - oracle.db.pdb + oracledb.transactions.limit: + enabled: true + oracledb.transactions.usage: + enabled: true + oracledb.user_commits: + enabled: true + attributes: + - oracle.db.pdb + oracledb.user_rollbacks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.tablespace_size.limit: + enabled: true + attributes: + - tablespace_name + - oracle.db.pdb + oracledb.tablespace_size.usage: + enabled: true + attributes: + - tablespace_name + - oracle.db.pdb + oracledb.storage.usage: + enabled: true + oracledb.storage.utilization: + enabled: true + oracledb.recycle_bin.limit: + enabled: true + oracledb.queries_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.ddl_statements_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.dml_statements_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_not_downgraded: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_1_to_25_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_25_to_50_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_50_to_75_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_75_to_99_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_to_serial: + enabled: true + attributes: + - oracle.db.pdb + oracledb.redo_allocation.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.sort.ratio: + enabled: true + attributes: + - oracledb.sort.type + - oracle.db.pdb + oracledb.sql_service.response.duration: + enabled: true + attributes: + - oracle.db.pdb + resource_attributes: + host.name: + enabled: true + oracle.db.hosting_type: + enabled: true + oracle.db.open_mode: + enabled: true + oracle.db.pdb: + enabled: true + oracle.db.role: + enabled: true + oracle.db.version: + enabled: true + oracledb.instance.name: + enabled: true + service.instance.id: + enabled: true + EOF + + if [ "$PRESET" = "2" ]; then + cat >> "$CONFIG_PATH" << 'EOF' + + processors: + metricstransform: + transforms: + - include: system.cpu.utilization + action: update + operations: + - action: aggregate_labels + label_set: [state] + aggregation_type: mean + - include: system.paging.operations + action: update + operations: + - action: aggregate_labels + label_set: [direction] + aggregation_type: sum + + filter/exclude_cpu_utilization: + metrics: + datapoint: + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "interrupt"' + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "nice"' + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "softirq"' + + filter/exclude_memory_utilization: + metrics: + datapoint: + - 'metric.name == "system.memory.utilization" and attributes["state"] == "slab_unreclaimable"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "inactive"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "cached"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "buffered"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "slab_reclaimable"' + + filter/exclude_memory_usage: + metrics: + datapoint: + - 'metric.name == "system.memory.usage" and attributes["state"] == "slab_unreclaimable"' + - 'metric.name == "system.memory.usage" and attributes["state"] == "inactive"' + + filter/exclude_filesystem_utilization: + metrics: + datapoint: + - 'metric.name == "system.filesystem.utilization" and attributes["type"] == "squashfs"' + + filter/exclude_filesystem_usage: + metrics: + datapoint: + - 'metric.name == "system.filesystem.usage" and attributes["type"] == "squashfs"' + - 'metric.name == "system.filesystem.usage" and attributes["state"] == "reserved"' + + filter/exclude_filesystem_inodes_usage: + metrics: + datapoint: + - 'metric.name == "system.filesystem.inodes.usage" and attributes["type"] == "squashfs"' + - 'metric.name == "system.filesystem.inodes.usage" and attributes["state"] == "reserved"' + + filter/exclude_system_disk: + metrics: + datapoint: + - 'metric.name == "system.disk.operations" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.merged" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.io" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.io_time" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.operation_time" and IsMatch(attributes["device"], "^loop.*") == true' + + filter/exclude_system_paging: + metrics: + datapoint: + - 'metric.name == "system.paging.usage" and attributes["state"] == "cached"' + - 'metric.name == "system.paging.operations" and attributes["type"] == "cached"' + + filter/exclude_network: + metrics: + datapoint: + - 'IsMatch(metric.name, "^system.network.*") == true and attributes["device"] == "lo"' + + attributes/exclude_system_paging: + include: + match_type: strict + metric_names: + - system.paging.operations + actions: + - key: type + action: delete + + transform/clear_metadata: + metric_statements: + - context: metric + statements: + - set(metric.description, "") + - set(metric.unit, "") + + transform/host: + metric_statements: + - context: metric + statements: + - set(metric.description, "") + - set(metric.unit, "") + + transform: + trace_statements: + - context: span + statements: + - truncate_all(span.attributes, 4095) + - truncate_all(resource.attributes, 4095) + log_statements: + - context: log + statements: + - truncate_all(log.attributes, 4095) + - truncate_all(resource.attributes, 4095) + EOF + + cat >> "$CONFIG_PATH" << EOF + + memory_limiter: + check_interval: 1s + limit_mib: \${env:NEW_RELIC_MEMORY_LIMIT_MIB:-100} + + batch: + + resource/add_event_name: + attributes: + - key: host.address + value: "${HOST}" + action: upsert + + resourcedetection: + detectors: ["system"] + system: + hostname_sources: ["os"] + resource_attributes: + host.id: + enabled: true + + resourcedetection/db_safe: + detectors: ["system"] + override: false + system: + hostname_sources: ["os"] + resource_attributes: + host.id: + enabled: true + + resourcedetection/cloud: + detectors: ["gcp", "ec2", "azure"] + timeout: 2s + override: true + + resourcedetection/env: + detectors: ["env"] + timeout: 2s + override: true + + exporters: + otlp: + endpoint: ${OTLP_ENDPOINT} + headers: + api-key: ${LICENSE_KEY} + compression: gzip + + service: + pipelines: + metrics/host: + receivers: [hostmetrics] + processors: + - memory_limiter + - metricstransform + - filter/exclude_cpu_utilization + - filter/exclude_memory_utilization + - filter/exclude_memory_usage + - filter/exclude_filesystem_utilization + - filter/exclude_filesystem_usage + - filter/exclude_filesystem_inodes_usage + - filter/exclude_system_disk + - filter/exclude_network + - attributes/exclude_system_paging + - transform/host + - resourcedetection + - resourcedetection/cloud + - resourcedetection/env + - batch + exporters: [otlp] + traces: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + metrics: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + metrics/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp] + logs/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp] + extensions: [health_check] + EOF + else + cat >> "$CONFIG_PATH" << EOF + + processors: + batch: + resource/add_event_name: + attributes: + - key: host.address + value: "${HOST}" + action: upsert + + exporters: + otlp/newrelic: + endpoint: ${OTLP_ENDPOINT} + headers: + api-key: ${LICENSE_KEY} + compression: gzip + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s + + service: + pipelines: + metrics/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp/newrelic] + logs/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp/newrelic] + EOF + fi + + cat > "$ENV_FILE" << EOF + OTELCOL_OPTIONS="--config=${CONFIG_PATH}" + EOF + + rm -f "$PW_FILE" + echo "Oracle OTel config written to ${CONFIG_PATH}" + echo "Env file written to ${ENV_FILE}" diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index 8ce04e171..74f21d228 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -306,3 +306,663 @@ install: echo "$RESULT" echo "Oracle Database monitoring identity configured successfully." + + create_collector_config: + cmds: + - | + PRESET="{{.NR_CLI_ORACLE_CONFIG_PRESET}}" + CONTAINER_TYPE="{{.NR_CLI_ORACLE_CONTAINER_TYPE}}" + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" + REGION="{{.NEW_RELIC_REGION}}" + LICENSE_KEY="{{.NEW_RELIC_LICENSE_KEY}}" + CONFIG_DIR="/etc/nrdot-collector" + CONFIG_PATH="${CONFIG_DIR}/oracle-config.yaml" + ENV_FILE="${CONFIG_DIR}/nrdot-collector.conf" + PW_FILE="/tmp/nr-oracle-newrelic-pw.tmp" + + mkdir -p "$CONFIG_DIR" + + NR_PASSWORD=$(cat "$PW_FILE") + + if [ "$CONTAINER_TYPE" = "1" ]; then + DB_USERNAME="c##${LOGIN_NAME}" + else + DB_USERNAME="${LOGIN_NAME}" + fi + + case "$REGION" in + staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net" ;; + EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net" ;; + JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net" ;; + *) OTLP_ENDPOINT="https://otlp.nr-data.net" ;; + esac + + if [ "$PRESET" = "2" ]; then + cat > "$CONFIG_PATH" << EOF + extensions: + health_check: + + receivers: + otlp: + protocols: + grpc: + http: + + hostmetrics: + collection_interval: 60s + scrapers: + cpu: + metrics: + system.cpu.time: + enabled: false + system.cpu.utilization: + enabled: true + load: + memory: + metrics: + system.memory.utilization: + enabled: true + paging: + metrics: + system.paging.utilization: + enabled: false + system.paging.faults: + enabled: false + filesystem: + metrics: + system.filesystem.utilization: + enabled: true + disk: + metrics: + system.disk.merged: + enabled: false + system.disk.pending_operations: + enabled: false + system.disk.weighted_io_time: + enabled: false + network: + metrics: + system.network.connections: + enabled: false + + filelog: + include: + - /var/log/alternatives.log + - /var/log/cloud-init.log + - /var/log/auth.log + - /var/log/dpkg.log + - /var/log/syslog + - /var/log/messages + - /var/log/secure + - /var/log/yum.log + + nroracledb: + endpoint: "${HOST}:${PORT}" + username: "${DB_USERNAME}" + password: "${NR_PASSWORD}" + service: "${SERVICE_NAME}" + collection_interval: 10s + events: + db.server.query_sample: + enabled: true + db.server.top_query: + enabled: true + db.server.session.wait_sample: + enabled: true + top_query_collection: + max_query_sample_count: 1000 + top_query_count: 200 + collection_interval: 60s + allowed_comment_keys: + - nr_service_guid + query_sample_collection: + max_rows_per_query: 100 + allowed_comment_keys: + - nr_service_guid + session_wait_event_collection: + max_rows_per_query: 100 + metrics: + EOF + else + cat > "$CONFIG_PATH" << EOF + receivers: + nroracledb: + endpoint: "${HOST}:${PORT}" + username: "${DB_USERNAME}" + password: "${NR_PASSWORD}" + service: "${SERVICE_NAME}" + collection_interval: 10s + events: + db.server.query_sample: + enabled: true + db.server.top_query: + enabled: true + db.server.session.wait_sample: + enabled: true + top_query_collection: + max_query_sample_count: 1000 + top_query_count: 200 + collection_interval: 60s + allowed_comment_keys: + - nr_service_guid + query_sample_collection: + max_rows_per_query: 100 + allowed_comment_keys: + - nr_service_guid + session_wait_event_collection: + max_rows_per_query: 100 + metrics: + EOF + fi + + cat >> "$CONFIG_PATH" << 'EOF' + oracledb.cpu_time: + enabled: true + attributes: + - oracle.db.pdb + oracledb.database.cpu.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.host.cpu.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.system.cpu.load: + enabled: true + oracledb.executions: + enabled: true + attributes: + - oracle.db.pdb + oracledb.execution.utilization: + enabled: true + attributes: + - oracledb.parse.type + - oracle.db.pdb + oracledb.parse_calls: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parse.rate: + enabled: true + attributes: + - oracledb.parse.result + - oracle.db.pdb + oracledb.parse.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.hard_parses: + enabled: true + attributes: + - oracle.db.pdb + oracledb.logical_reads: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_reads: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_reads_direct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_writes: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_writes_direct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_read_io_requests: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_write_io_requests: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_io.cache_writes: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_io.requests: + enabled: true + attributes: + - disk.io.direction + - disk.io.block_size + - oracle.db.pdb + oracledb.physical_io.transferred: + enabled: true + attributes: + - disk.io.direction + - disk.io.type + - oracle.db.pdb + oracledb.sqlnet.io.transferred: + enabled: true + attributes: + - network.io.direction + - destination.type + - oracle.db.pdb + oracledb.consistent_gets: + enabled: true + attributes: + - oracle.db.pdb + oracledb.db_block_gets: + enabled: true + attributes: + - oracle.db.pdb + oracledb.buffer_cache.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.library_cache.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.data_dictionary.hit_ratio: + enabled: true + oracledb.shared_pool.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.pga_memory: + enabled: true + attributes: + - oracle.db.pdb + oracledb.sga.limit: + enabled: true + oracledb.sga.usage: + enabled: true + attributes: + - oracledb.sga.component.name + oracledb.database.wait.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.dml_locks.limit: + enabled: true + oracledb.dml_locks.usage: + enabled: true + oracledb.enqueue_locks.limit: + enabled: true + oracledb.enqueue_locks.usage: + enabled: true + oracledb.enqueue_resources.limit: + enabled: true + oracledb.enqueue_resources.usage: + enabled: true + oracledb.enqueue_deadlocks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.exchange_deadlocks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.processes.limit: + enabled: true + oracledb.processes.usage: + enabled: true + oracledb.sessions.limit: + enabled: true + oracledb.sessions.usage: + enabled: true + attributes: + - session_type + - session_status + - oracle.db.pdb + oracledb.logons: + enabled: true + attributes: + - oracle.db.pdb + oracledb.transactions.limit: + enabled: true + oracledb.transactions.usage: + enabled: true + oracledb.user_commits: + enabled: true + attributes: + - oracle.db.pdb + oracledb.user_rollbacks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.tablespace_size.limit: + enabled: true + attributes: + - tablespace_name + - oracle.db.pdb + oracledb.tablespace_size.usage: + enabled: true + attributes: + - tablespace_name + - oracle.db.pdb + oracledb.storage.usage: + enabled: true + oracledb.storage.utilization: + enabled: true + oracledb.recycle_bin.limit: + enabled: true + oracledb.queries_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.ddl_statements_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.dml_statements_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_not_downgraded: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_1_to_25_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_25_to_50_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_50_to_75_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_75_to_99_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_to_serial: + enabled: true + attributes: + - oracle.db.pdb + oracledb.redo_allocation.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.sort.ratio: + enabled: true + attributes: + - oracledb.sort.type + - oracle.db.pdb + oracledb.sql_service.response.duration: + enabled: true + attributes: + - oracle.db.pdb + resource_attributes: + host.name: + enabled: true + oracle.db.hosting_type: + enabled: true + oracle.db.open_mode: + enabled: true + oracle.db.pdb: + enabled: true + oracle.db.role: + enabled: true + oracle.db.version: + enabled: true + oracledb.instance.name: + enabled: true + service.instance.id: + enabled: true + EOF + + if [ "$PRESET" = "2" ]; then + cat >> "$CONFIG_PATH" << 'EOF' + + processors: + metricstransform: + transforms: + - include: system.cpu.utilization + action: update + operations: + - action: aggregate_labels + label_set: [state] + aggregation_type: mean + - include: system.paging.operations + action: update + operations: + - action: aggregate_labels + label_set: [direction] + aggregation_type: sum + + filter/exclude_cpu_utilization: + metrics: + datapoint: + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "interrupt"' + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "nice"' + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "softirq"' + + filter/exclude_memory_utilization: + metrics: + datapoint: + - 'metric.name == "system.memory.utilization" and attributes["state"] == "slab_unreclaimable"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "inactive"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "cached"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "buffered"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "slab_reclaimable"' + + filter/exclude_memory_usage: + metrics: + datapoint: + - 'metric.name == "system.memory.usage" and attributes["state"] == "slab_unreclaimable"' + - 'metric.name == "system.memory.usage" and attributes["state"] == "inactive"' + + filter/exclude_filesystem_utilization: + metrics: + datapoint: + - 'metric.name == "system.filesystem.utilization" and attributes["type"] == "squashfs"' + + filter/exclude_filesystem_usage: + metrics: + datapoint: + - 'metric.name == "system.filesystem.usage" and attributes["type"] == "squashfs"' + - 'metric.name == "system.filesystem.usage" and attributes["state"] == "reserved"' + + filter/exclude_filesystem_inodes_usage: + metrics: + datapoint: + - 'metric.name == "system.filesystem.inodes.usage" and attributes["type"] == "squashfs"' + - 'metric.name == "system.filesystem.inodes.usage" and attributes["state"] == "reserved"' + + filter/exclude_system_disk: + metrics: + datapoint: + - 'metric.name == "system.disk.operations" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.merged" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.io" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.io_time" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.operation_time" and IsMatch(attributes["device"], "^loop.*") == true' + + filter/exclude_system_paging: + metrics: + datapoint: + - 'metric.name == "system.paging.usage" and attributes["state"] == "cached"' + - 'metric.name == "system.paging.operations" and attributes["type"] == "cached"' + + filter/exclude_network: + metrics: + datapoint: + - 'IsMatch(metric.name, "^system.network.*") == true and attributes["device"] == "lo"' + + attributes/exclude_system_paging: + include: + match_type: strict + metric_names: + - system.paging.operations + actions: + - key: type + action: delete + + transform/clear_metadata: + metric_statements: + - context: metric + statements: + - set(metric.description, "") + - set(metric.unit, "") + + transform/host: + metric_statements: + - context: metric + statements: + - set(metric.description, "") + - set(metric.unit, "") + + transform: + trace_statements: + - context: span + statements: + - truncate_all(span.attributes, 4095) + - truncate_all(resource.attributes, 4095) + log_statements: + - context: log + statements: + - truncate_all(log.attributes, 4095) + - truncate_all(resource.attributes, 4095) + EOF + + cat >> "$CONFIG_PATH" << EOF + + memory_limiter: + check_interval: 1s + limit_mib: \${env:NEW_RELIC_MEMORY_LIMIT_MIB:-100} + + batch: + + resource/add_event_name: + attributes: + - key: host.address + value: "${HOST}" + action: upsert + + resourcedetection: + detectors: ["system"] + system: + hostname_sources: ["os"] + resource_attributes: + host.id: + enabled: true + + resourcedetection/db_safe: + detectors: ["system"] + override: false + system: + hostname_sources: ["os"] + resource_attributes: + host.id: + enabled: true + + resourcedetection/cloud: + detectors: ["gcp", "ec2", "azure"] + timeout: 2s + override: true + + resourcedetection/env: + detectors: ["env"] + timeout: 2s + override: true + + exporters: + otlp: + endpoint: ${OTLP_ENDPOINT} + headers: + api-key: ${LICENSE_KEY} + compression: gzip + + service: + pipelines: + metrics/host: + receivers: [hostmetrics] + processors: + - memory_limiter + - metricstransform + - filter/exclude_cpu_utilization + - filter/exclude_memory_utilization + - filter/exclude_memory_usage + - filter/exclude_filesystem_utilization + - filter/exclude_filesystem_usage + - filter/exclude_filesystem_inodes_usage + - filter/exclude_system_disk + - filter/exclude_network + - attributes/exclude_system_paging + - transform/host + - resourcedetection + - resourcedetection/cloud + - resourcedetection/env + - batch + exporters: [otlp] + traces: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + metrics: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + metrics/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp] + logs/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp] + extensions: [health_check] + EOF + else + cat >> "$CONFIG_PATH" << EOF + + processors: + batch: + resource/add_event_name: + attributes: + - key: host.address + value: "${HOST}" + action: upsert + + exporters: + otlp/newrelic: + endpoint: ${OTLP_ENDPOINT} + headers: + api-key: ${LICENSE_KEY} + compression: gzip + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s + + service: + pipelines: + metrics/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp/newrelic] + logs/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp/newrelic] + EOF + fi + + cat > "$ENV_FILE" << EOF + OTELCOL_OPTIONS="--config=${CONFIG_PATH}" + EOF + + rm -f "$PW_FILE" + echo "Oracle OTel config written to ${CONFIG_PATH}" + echo "Env file written to ${ENV_FILE}" From 0d5fccda8406ce4a31c717f41eaab68e6cab7125 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 4 Aug 2026 21:26:24 +0530 Subject: [PATCH 10/33] feat(nrdot-oracle): add rds-debian.yml/rds-rhel.yml create_collector_config task --- .../nrdot/oracle-otel/rds-debian.yml | 356 ++++++++++++++++++ .../nrdot/oracle-otel/rds-rhel.yml | 356 ++++++++++++++++++ 2 files changed, 712 insertions(+) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index 53a3d12ba..56d564234 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -244,3 +244,359 @@ install: echo "$RESULT" echo "RDS Oracle Database monitoring identity configured successfully." + + create_collector_config: + cmds: + - | + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" + REGION="{{.NEW_RELIC_REGION}}" + LICENSE_KEY="{{.NEW_RELIC_LICENSE_KEY}}" + CONFIG_DIR="/etc/nrdot-collector" + CONFIG_PATH="${CONFIG_DIR}/oracle-config.yaml" + ENV_FILE="${CONFIG_DIR}/nrdot-collector.conf" + PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" + + mkdir -p "$CONFIG_DIR" + + NR_PASSWORD=$(cat "$PW_FILE") + + case "$REGION" in + staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net" ;; + EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net" ;; + JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net" ;; + *) OTLP_ENDPOINT="https://otlp.nr-data.net" ;; + esac + + cat > "$CONFIG_PATH" << EOF + receivers: + nroracledb: + endpoint: "${HOST}:${PORT}" + username: "${LOGIN_NAME}" + password: "${NR_PASSWORD}" + service: "${SERVICE_NAME}" + collection_interval: 10s + events: + db.server.query_sample: + enabled: true + db.server.top_query: + enabled: true + db.server.session.wait_sample: + enabled: true + top_query_collection: + max_query_sample_count: 1000 + top_query_count: 200 + collection_interval: 60s + allowed_comment_keys: + - nr_service_guid + query_sample_collection: + max_rows_per_query: 100 + allowed_comment_keys: + - nr_service_guid + session_wait_event_collection: + max_rows_per_query: 100 + metrics: + EOF + + cat >> "$CONFIG_PATH" << 'EOF' + oracledb.cpu_time: + enabled: true + attributes: + - oracle.db.pdb + oracledb.database.cpu.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.host.cpu.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.system.cpu.load: + enabled: true + oracledb.executions: + enabled: true + attributes: + - oracle.db.pdb + oracledb.execution.utilization: + enabled: true + attributes: + - oracledb.parse.type + - oracle.db.pdb + oracledb.parse_calls: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parse.rate: + enabled: true + attributes: + - oracledb.parse.result + - oracle.db.pdb + oracledb.parse.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.hard_parses: + enabled: true + attributes: + - oracle.db.pdb + oracledb.logical_reads: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_reads: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_reads_direct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_writes: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_writes_direct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_read_io_requests: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_write_io_requests: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_io.cache_writes: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_io.requests: + enabled: true + attributes: + - disk.io.direction + - disk.io.block_size + - oracle.db.pdb + oracledb.physical_io.transferred: + enabled: true + attributes: + - disk.io.direction + - disk.io.type + - oracle.db.pdb + oracledb.sqlnet.io.transferred: + enabled: true + attributes: + - network.io.direction + - destination.type + - oracle.db.pdb + oracledb.consistent_gets: + enabled: true + attributes: + - oracle.db.pdb + oracledb.db_block_gets: + enabled: true + attributes: + - oracle.db.pdb + oracledb.buffer_cache.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.library_cache.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.data_dictionary.hit_ratio: + enabled: true + oracledb.shared_pool.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.pga_memory: + enabled: true + attributes: + - oracle.db.pdb + oracledb.sga.limit: + enabled: true + oracledb.sga.usage: + enabled: true + attributes: + - oracledb.sga.component.name + oracledb.database.wait.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.dml_locks.limit: + enabled: true + oracledb.dml_locks.usage: + enabled: true + oracledb.enqueue_locks.limit: + enabled: true + oracledb.enqueue_locks.usage: + enabled: true + oracledb.enqueue_resources.limit: + enabled: true + oracledb.enqueue_resources.usage: + enabled: true + oracledb.enqueue_deadlocks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.exchange_deadlocks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.processes.limit: + enabled: true + oracledb.processes.usage: + enabled: true + oracledb.sessions.limit: + enabled: true + oracledb.sessions.usage: + enabled: true + attributes: + - session_type + - session_status + - oracle.db.pdb + oracledb.logons: + enabled: true + attributes: + - oracle.db.pdb + oracledb.transactions.limit: + enabled: true + oracledb.transactions.usage: + enabled: true + oracledb.user_commits: + enabled: true + attributes: + - oracle.db.pdb + oracledb.user_rollbacks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.tablespace_size.limit: + enabled: true + attributes: + - tablespace_name + - oracle.db.pdb + oracledb.tablespace_size.usage: + enabled: true + attributes: + - tablespace_name + - oracle.db.pdb + oracledb.storage.usage: + enabled: true + oracledb.storage.utilization: + enabled: true + oracledb.recycle_bin.limit: + enabled: true + oracledb.queries_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.ddl_statements_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.dml_statements_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_not_downgraded: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_1_to_25_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_25_to_50_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_50_to_75_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_75_to_99_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_to_serial: + enabled: true + attributes: + - oracle.db.pdb + oracledb.redo_allocation.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.sort.ratio: + enabled: true + attributes: + - oracledb.sort.type + - oracle.db.pdb + oracledb.sql_service.response.duration: + enabled: true + attributes: + - oracle.db.pdb + resource_attributes: + host.name: + enabled: true + oracle.db.hosting_type: + enabled: true + oracle.db.open_mode: + enabled: true + oracle.db.pdb: + enabled: true + oracle.db.role: + enabled: true + oracle.db.version: + enabled: true + oracledb.instance.name: + enabled: true + service.instance.id: + enabled: true + EOF + + cat >> "$CONFIG_PATH" << EOF + + processors: + batch: + resource/add_event_name: + attributes: + - key: host.address + value: "${HOST}" + action: upsert + + exporters: + otlp/newrelic: + endpoint: ${OTLP_ENDPOINT} + headers: + api-key: ${LICENSE_KEY} + compression: gzip + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s + + service: + pipelines: + metrics/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp/newrelic] + logs/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp/newrelic] + EOF + + cat > "$ENV_FILE" << EOF + OTELCOL_OPTIONS="--config=${CONFIG_PATH}" + EOF + + rm -f "$PW_FILE" + echo "Oracle OTel config written to ${CONFIG_PATH}" + echo "Env file written to ${ENV_FILE}" diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index 1e777a730..4d2dfd91b 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -248,3 +248,359 @@ install: echo "$RESULT" echo "RDS Oracle Database monitoring identity configured successfully." + + create_collector_config: + cmds: + - | + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" + REGION="{{.NEW_RELIC_REGION}}" + LICENSE_KEY="{{.NEW_RELIC_LICENSE_KEY}}" + CONFIG_DIR="/etc/nrdot-collector" + CONFIG_PATH="${CONFIG_DIR}/oracle-config.yaml" + ENV_FILE="${CONFIG_DIR}/nrdot-collector.conf" + PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" + + mkdir -p "$CONFIG_DIR" + + NR_PASSWORD=$(cat "$PW_FILE") + + case "$REGION" in + staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net" ;; + EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net" ;; + JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net" ;; + *) OTLP_ENDPOINT="https://otlp.nr-data.net" ;; + esac + + cat > "$CONFIG_PATH" << EOF + receivers: + nroracledb: + endpoint: "${HOST}:${PORT}" + username: "${LOGIN_NAME}" + password: "${NR_PASSWORD}" + service: "${SERVICE_NAME}" + collection_interval: 10s + events: + db.server.query_sample: + enabled: true + db.server.top_query: + enabled: true + db.server.session.wait_sample: + enabled: true + top_query_collection: + max_query_sample_count: 1000 + top_query_count: 200 + collection_interval: 60s + allowed_comment_keys: + - nr_service_guid + query_sample_collection: + max_rows_per_query: 100 + allowed_comment_keys: + - nr_service_guid + session_wait_event_collection: + max_rows_per_query: 100 + metrics: + EOF + + cat >> "$CONFIG_PATH" << 'EOF' + oracledb.cpu_time: + enabled: true + attributes: + - oracle.db.pdb + oracledb.database.cpu.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.host.cpu.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.system.cpu.load: + enabled: true + oracledb.executions: + enabled: true + attributes: + - oracle.db.pdb + oracledb.execution.utilization: + enabled: true + attributes: + - oracledb.parse.type + - oracle.db.pdb + oracledb.parse_calls: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parse.rate: + enabled: true + attributes: + - oracledb.parse.result + - oracle.db.pdb + oracledb.parse.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.hard_parses: + enabled: true + attributes: + - oracle.db.pdb + oracledb.logical_reads: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_reads: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_reads_direct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_writes: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_writes_direct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_read_io_requests: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_write_io_requests: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_io.cache_writes: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_io.requests: + enabled: true + attributes: + - disk.io.direction + - disk.io.block_size + - oracle.db.pdb + oracledb.physical_io.transferred: + enabled: true + attributes: + - disk.io.direction + - disk.io.type + - oracle.db.pdb + oracledb.sqlnet.io.transferred: + enabled: true + attributes: + - network.io.direction + - destination.type + - oracle.db.pdb + oracledb.consistent_gets: + enabled: true + attributes: + - oracle.db.pdb + oracledb.db_block_gets: + enabled: true + attributes: + - oracle.db.pdb + oracledb.buffer_cache.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.library_cache.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.data_dictionary.hit_ratio: + enabled: true + oracledb.shared_pool.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.pga_memory: + enabled: true + attributes: + - oracle.db.pdb + oracledb.sga.limit: + enabled: true + oracledb.sga.usage: + enabled: true + attributes: + - oracledb.sga.component.name + oracledb.database.wait.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.dml_locks.limit: + enabled: true + oracledb.dml_locks.usage: + enabled: true + oracledb.enqueue_locks.limit: + enabled: true + oracledb.enqueue_locks.usage: + enabled: true + oracledb.enqueue_resources.limit: + enabled: true + oracledb.enqueue_resources.usage: + enabled: true + oracledb.enqueue_deadlocks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.exchange_deadlocks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.processes.limit: + enabled: true + oracledb.processes.usage: + enabled: true + oracledb.sessions.limit: + enabled: true + oracledb.sessions.usage: + enabled: true + attributes: + - session_type + - session_status + - oracle.db.pdb + oracledb.logons: + enabled: true + attributes: + - oracle.db.pdb + oracledb.transactions.limit: + enabled: true + oracledb.transactions.usage: + enabled: true + oracledb.user_commits: + enabled: true + attributes: + - oracle.db.pdb + oracledb.user_rollbacks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.tablespace_size.limit: + enabled: true + attributes: + - tablespace_name + - oracle.db.pdb + oracledb.tablespace_size.usage: + enabled: true + attributes: + - tablespace_name + - oracle.db.pdb + oracledb.storage.usage: + enabled: true + oracledb.storage.utilization: + enabled: true + oracledb.recycle_bin.limit: + enabled: true + oracledb.queries_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.ddl_statements_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.dml_statements_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_not_downgraded: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_1_to_25_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_25_to_50_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_50_to_75_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_75_to_99_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_to_serial: + enabled: true + attributes: + - oracle.db.pdb + oracledb.redo_allocation.utilization: + enabled: true + attributes: + - oracle.db.pdb + oracledb.sort.ratio: + enabled: true + attributes: + - oracledb.sort.type + - oracle.db.pdb + oracledb.sql_service.response.duration: + enabled: true + attributes: + - oracle.db.pdb + resource_attributes: + host.name: + enabled: true + oracle.db.hosting_type: + enabled: true + oracle.db.open_mode: + enabled: true + oracle.db.pdb: + enabled: true + oracle.db.role: + enabled: true + oracle.db.version: + enabled: true + oracledb.instance.name: + enabled: true + service.instance.id: + enabled: true + EOF + + cat >> "$CONFIG_PATH" << EOF + + processors: + batch: + resource/add_event_name: + attributes: + - key: host.address + value: "${HOST}" + action: upsert + + exporters: + otlp/newrelic: + endpoint: ${OTLP_ENDPOINT} + headers: + api-key: ${LICENSE_KEY} + compression: gzip + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s + + service: + pipelines: + metrics/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp/newrelic] + logs/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp/newrelic] + EOF + + cat > "$ENV_FILE" << EOF + OTELCOL_OPTIONS="--config=${CONFIG_PATH}" + EOF + + rm -f "$PW_FILE" + echo "Oracle OTel config written to ${CONFIG_PATH}" + echo "Env file written to ${ENV_FILE}" From 3671ee4a1131cfdf2899f428f970c8a2dd4c4d73 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 4 Aug 2026 21:34:36 +0530 Subject: [PATCH 11/33] add restart/verify tasks and postInstall --- .../nrdot/oracle-otel/debian.yml | 43 +++++++++++++++++++ .../infrastructure/nrdot/oracle-otel/rhel.yml | 43 +++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml index da5212ac3..7a3343043 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml @@ -962,3 +962,46 @@ install: rm -f "$PW_FILE" echo "Oracle OTel config written to ${CONFIG_PATH}" echo "Env file written to ${ENV_FILE}" + + restart_nrdot: + cmds: + - | + systemctl restart nrdot-collector + + assert_nrdot_status_ok: + cmds: + - | + MAX_RETRIES=30 + TRIES=0 + echo "Waiting for NRDOT Collector to start..." + while [ $TRIES -lt $MAX_RETRIES ]; do + TRIES=$((TRIES + 1)) + if systemctl is-active --quiet nrdot-collector; then + echo "NRDOT Collector is running." + exit 0 + fi + sleep 2 + done + echo "NRDOT Collector did not start in time. Check logs:" >&2 + journalctl -u nrdot-collector --no-pager -n 50 >&2 + exit 31 + + default: + cmds: + - task: write_recipe_metadata + - task: assert_pre_req + - task: assert_container_type_inputs + - task: assert_oracle_version + - task: install_nrdot + - task: configure_database_user + - task: create_collector_config + - task: restart_nrdot + - task: assert_nrdot_status_ok + +postInstall: + info: |2 + Oracle OTel config: /etc/nrdot-collector/oracle-config.yaml + Env file: /etc/nrdot-collector/nrdot-collector.conf + Service status: systemctl status nrdot-collector + View logs: journalctl -u nrdot-collector -f + Restart service: sudo systemctl restart nrdot-collector diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index 74f21d228..310b2febf 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -966,3 +966,46 @@ install: rm -f "$PW_FILE" echo "Oracle OTel config written to ${CONFIG_PATH}" echo "Env file written to ${ENV_FILE}" + + restart_nrdot: + cmds: + - | + systemctl restart nrdot-collector + + assert_nrdot_status_ok: + cmds: + - | + MAX_RETRIES=30 + TRIES=0 + echo "Waiting for NRDOT Collector to start..." + while [ $TRIES -lt $MAX_RETRIES ]; do + TRIES=$((TRIES + 1)) + if systemctl is-active --quiet nrdot-collector; then + echo "NRDOT Collector is running." + exit 0 + fi + sleep 2 + done + echo "NRDOT Collector did not start in time. Check logs:" >&2 + journalctl -u nrdot-collector --no-pager -n 50 >&2 + exit 31 + + default: + cmds: + - task: write_recipe_metadata + - task: assert_pre_req + - task: assert_container_type_inputs + - task: assert_oracle_version + - task: install_nrdot + - task: configure_database_user + - task: create_collector_config + - task: restart_nrdot + - task: assert_nrdot_status_ok + +postInstall: + info: |2 + Oracle OTel config: /etc/nrdot-collector/oracle-config.yaml + Env file: /etc/nrdot-collector/nrdot-collector.conf + Service status: systemctl status nrdot-collector + View logs: journalctl -u nrdot-collector -f + Restart service: sudo systemctl restart nrdot-collector From f229bfc0cee35f0b6b80e18d5cfff6394ad9cf31 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 4 Aug 2026 21:43:59 +0530 Subject: [PATCH 12/33] feat(nrdot-oracle): wire up rds-debian.yml/rds-rhel.yml default task chain, add restart/verify tasks and postInstall --- .../nrdot/oracle-otel/rds-debian.yml | 42 +++++++++++++++++++ .../nrdot/oracle-otel/rds-rhel.yml | 42 +++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index 56d564234..c4329bb25 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -600,3 +600,45 @@ install: rm -f "$PW_FILE" echo "Oracle OTel config written to ${CONFIG_PATH}" echo "Env file written to ${ENV_FILE}" + + restart_nrdot: + cmds: + - | + systemctl restart nrdot-collector + + assert_nrdot_status_ok: + cmds: + - | + MAX_RETRIES=30 + TRIES=0 + echo "Waiting for NRDOT Collector to start..." + while [ $TRIES -lt $MAX_RETRIES ]; do + TRIES=$((TRIES + 1)) + if systemctl is-active --quiet nrdot-collector; then + echo "NRDOT Collector is running." + exit 0 + fi + sleep 2 + done + echo "NRDOT Collector did not start in time. Check logs:" >&2 + journalctl -u nrdot-collector --no-pager -n 50 >&2 + exit 31 + + default: + cmds: + - task: write_recipe_metadata + - task: assert_pre_req + - task: assert_oracle_version + - task: install_nrdot + - task: configure_database_user + - task: create_collector_config + - task: restart_nrdot + - task: assert_nrdot_status_ok + +postInstall: + info: |2 + Oracle OTel config: /etc/nrdot-collector/oracle-config.yaml + Env file: /etc/nrdot-collector/nrdot-collector.conf + Service status: systemctl status nrdot-collector + View logs: journalctl -u nrdot-collector -f + Restart service: sudo systemctl restart nrdot-collector diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index 4d2dfd91b..d870936a2 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -604,3 +604,45 @@ install: rm -f "$PW_FILE" echo "Oracle OTel config written to ${CONFIG_PATH}" echo "Env file written to ${ENV_FILE}" + + restart_nrdot: + cmds: + - | + systemctl restart nrdot-collector + + assert_nrdot_status_ok: + cmds: + - | + MAX_RETRIES=30 + TRIES=0 + echo "Waiting for NRDOT Collector to start..." + while [ $TRIES -lt $MAX_RETRIES ]; do + TRIES=$((TRIES + 1)) + if systemctl is-active --quiet nrdot-collector; then + echo "NRDOT Collector is running." + exit 0 + fi + sleep 2 + done + echo "NRDOT Collector did not start in time. Check logs:" >&2 + journalctl -u nrdot-collector --no-pager -n 50 >&2 + exit 31 + + default: + cmds: + - task: write_recipe_metadata + - task: assert_pre_req + - task: assert_oracle_version + - task: install_nrdot + - task: configure_database_user + - task: create_collector_config + - task: restart_nrdot + - task: assert_nrdot_status_ok + +postInstall: + info: |2 + Oracle OTel config: /etc/nrdot-collector/oracle-config.yaml + Env file: /etc/nrdot-collector/nrdot-collector.conf + Service status: systemctl status nrdot-collector + View logs: journalctl -u nrdot-collector -f + Restart service: sudo systemctl restart nrdot-collector From 85ebfba607bc58a19fc674345965259886f635fc Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 4 Aug 2026 21:54:16 +0530 Subject: [PATCH 13/33] test(nrdot-oracle): add E2E test definitions for all four Oracle OTel recipes --- .../debian/ubuntu-22-oracle-otel.json | 35 +++++++++++++++++++ .../rds-debian/ubuntu-22-oracle-otel-rds.json | 35 +++++++++++++++++++ .../rds-rhel/centos-9-oracle-otel-rds.json | 35 +++++++++++++++++++ .../rhel/centos-9-oracle-otel.json | 35 +++++++++++++++++++ 4 files changed, 140 insertions(+) create mode 100644 test/definitions/nrdot/oracle-otel/debian/ubuntu-22-oracle-otel.json create mode 100644 test/definitions/nrdot/oracle-otel/rds-debian/ubuntu-22-oracle-otel-rds.json create mode 100644 test/definitions/nrdot/oracle-otel/rds-rhel/centos-9-oracle-otel-rds.json create mode 100644 test/definitions/nrdot/oracle-otel/rhel/centos-9-oracle-otel.json diff --git a/test/definitions/nrdot/oracle-otel/debian/ubuntu-22-oracle-otel.json b/test/definitions/nrdot/oracle-otel/debian/ubuntu-22-oracle-otel.json new file mode 100644 index 000000000..a4e9005c8 --- /dev/null +++ b/test/definitions/nrdot/oracle-otel/debian/ubuntu-22-oracle-otel.json @@ -0,0 +1,35 @@ +{ + "global_tags": { + "owning_team": "database-integrations", + "Environment": "development", + "Department": "product", + "Product": "database-integrations" + }, + "resources": [ + { + "id": "host1", + "provider": "aws", + "type": "ec2", + "size": "t3.medium", + "ami_name": "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*", + "user_name": "ubuntu" + } + ], + "instrumentations": { + "resources": [ + { + "id": "oracleotelubuntu", + "resource_ids": ["host1"], + "source_repository": "https://github.com/newrelic/open-install-library.git", + "deploy_script_path": "test/deploy/linux/newrelic-cli/install-recipe/roles", + "params": { + "recipe_content_url": "https://raw.githubusercontent.com/newrelic/open-install-library/main/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml", + "recipe_targeted": "nrdot-collector-oracle", + "validate_output": "NRDOT Oracle Database \\(Debian/Ubuntu\\)\\s+\\(installed\\)", + "env_var": "NEW_RELIC_CLI_SKIP_CORE=1 NR_CLI_ORACLE_CONFIG_PRESET=1 NR_CLI_ORACLE_CONTAINER_TYPE=1 NR_CLI_ORACLE_HOST=localhost NR_CLI_ORACLE_PORT=1521 NR_CLI_ORACLE_SYS_PASSWORD=[credential:secrets:nrOracleSysPassword] NR_CLI_ORACLE_SERVICE_NAME=[credential:secrets:nrOracleCdbServiceName]" + }, + "provider": "newrelic" + } + ] + } +} diff --git a/test/definitions/nrdot/oracle-otel/rds-debian/ubuntu-22-oracle-otel-rds.json b/test/definitions/nrdot/oracle-otel/rds-debian/ubuntu-22-oracle-otel-rds.json new file mode 100644 index 000000000..edf8be088 --- /dev/null +++ b/test/definitions/nrdot/oracle-otel/rds-debian/ubuntu-22-oracle-otel-rds.json @@ -0,0 +1,35 @@ +{ + "global_tags": { + "owning_team": "database-integrations", + "Environment": "development", + "Department": "product", + "Product": "database-integrations" + }, + "resources": [ + { + "id": "host1", + "provider": "aws", + "type": "ec2", + "size": "t3.medium", + "ami_name": "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*", + "user_name": "ubuntu" + } + ], + "instrumentations": { + "resources": [ + { + "id": "oracleotelrdsubuntu", + "resource_ids": ["host1"], + "source_repository": "https://github.com/newrelic/open-install-library.git", + "deploy_script_path": "test/deploy/linux/newrelic-cli/install-recipe/roles", + "params": { + "recipe_content_url": "https://raw.githubusercontent.com/newrelic/open-install-library/main/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml", + "recipe_targeted": "nrdot-collector-oracle-rds", + "validate_output": "NRDOT Oracle Database \\(AWS RDS, Debian/Ubuntu collector host\\)\\s+\\(installed\\)", + "env_var": "NEW_RELIC_CLI_SKIP_CORE=1 NR_CLI_ORACLE_HOST=[credential:secrets:nrOracleRdsEndpoint] NR_CLI_ORACLE_PORT=1521 NR_CLI_ORACLE_ADMIN_USER=[credential:secrets:nrOracleRdsAdminUser] NR_CLI_ORACLE_ADMIN_PASSWORD=[credential:secrets:nrOracleRdsAdminPassword] NR_CLI_ORACLE_SERVICE_NAME=[credential:secrets:nrOracleRdsServiceName]" + }, + "provider": "newrelic" + } + ] + } +} diff --git a/test/definitions/nrdot/oracle-otel/rds-rhel/centos-9-oracle-otel-rds.json b/test/definitions/nrdot/oracle-otel/rds-rhel/centos-9-oracle-otel-rds.json new file mode 100644 index 000000000..d807c57e8 --- /dev/null +++ b/test/definitions/nrdot/oracle-otel/rds-rhel/centos-9-oracle-otel-rds.json @@ -0,0 +1,35 @@ +{ + "global_tags": { + "owning_team": "database-integrations", + "Environment": "development", + "Department": "product", + "Product": "database-integrations" + }, + "resources": [ + { + "id": "host1", + "provider": "aws", + "type": "ec2", + "size": "t3.medium", + "ami_name": "CentOS Stream 9 x86_64*", + "user_name": "ec2-user" + } + ], + "instrumentations": { + "resources": [ + { + "id": "oracleotelrdscentos", + "resource_ids": ["host1"], + "source_repository": "https://github.com/newrelic/open-install-library.git", + "deploy_script_path": "test/deploy/linux/newrelic-cli/install-recipe/roles", + "params": { + "recipe_content_url": "https://raw.githubusercontent.com/newrelic/open-install-library/main/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml", + "recipe_targeted": "nrdot-collector-oracle-rds", + "validate_output": "NRDOT Oracle Database \\(AWS RDS, RHEL/CentOS/OEL collector host\\)\\s+\\(installed\\)", + "env_var": "NEW_RELIC_CLI_SKIP_CORE=1 NR_CLI_ORACLE_HOST=[credential:secrets:nrOracleRdsEndpoint] NR_CLI_ORACLE_PORT=1521 NR_CLI_ORACLE_ADMIN_USER=[credential:secrets:nrOracleRdsAdminUser] NR_CLI_ORACLE_ADMIN_PASSWORD=[credential:secrets:nrOracleRdsAdminPassword] NR_CLI_ORACLE_SERVICE_NAME=[credential:secrets:nrOracleRdsServiceName]" + }, + "provider": "newrelic" + } + ] + } +} diff --git a/test/definitions/nrdot/oracle-otel/rhel/centos-9-oracle-otel.json b/test/definitions/nrdot/oracle-otel/rhel/centos-9-oracle-otel.json new file mode 100644 index 000000000..e0884aada --- /dev/null +++ b/test/definitions/nrdot/oracle-otel/rhel/centos-9-oracle-otel.json @@ -0,0 +1,35 @@ +{ + "global_tags": { + "owning_team": "database-integrations", + "Environment": "development", + "Department": "product", + "Product": "database-integrations" + }, + "resources": [ + { + "id": "host1", + "provider": "aws", + "type": "ec2", + "size": "t3.medium", + "ami_name": "CentOS Stream 9 x86_64*", + "user_name": "ec2-user" + } + ], + "instrumentations": { + "resources": [ + { + "id": "oracleotelcentos", + "resource_ids": ["host1"], + "source_repository": "https://github.com/newrelic/open-install-library.git", + "deploy_script_path": "test/deploy/linux/newrelic-cli/install-recipe/roles", + "params": { + "recipe_content_url": "https://raw.githubusercontent.com/newrelic/open-install-library/main/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml", + "recipe_targeted": "nrdot-collector-oracle", + "validate_output": "NRDOT Oracle Database \\(RHEL/CentOS/OEL\\)\\s+\\(installed\\)", + "env_var": "NEW_RELIC_CLI_SKIP_CORE=1 NR_CLI_ORACLE_CONFIG_PRESET=1 NR_CLI_ORACLE_CONTAINER_TYPE=1 NR_CLI_ORACLE_HOST=localhost NR_CLI_ORACLE_PORT=1521 NR_CLI_ORACLE_SYS_PASSWORD=[credential:secrets:nrOracleSysPassword] NR_CLI_ORACLE_SERVICE_NAME=[credential:secrets:nrOracleCdbServiceName]" + }, + "provider": "newrelic" + } + ] + } +} From 94ab7446bee126a8af917e8d23ad9f9ebc56c3d1 Mon Sep 17 00:00:00 2001 From: rreddy Date: Thu, 6 Aug 2026 10:12:20 +0530 Subject: [PATCH 14/33] scope Oracle OTel to RHEL/OEL only, drop Debian variants --- .../nrdot/oracle-otel/debian.yml | 1007 ----------------- .../nrdot/oracle-otel/rds-debian.yml | 644 ----------- .../infrastructure/nrdot/oracle-otel/rhel.yml | 22 +- .../debian/ubuntu-22-oracle-otel.json | 35 - .../rds-debian/ubuntu-22-oracle-otel-rds.json | 35 - ...acle-otel.json => rhel-9-oracle-otel.json} | 6 +- 6 files changed, 14 insertions(+), 1735 deletions(-) delete mode 100644 recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml delete mode 100644 recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml delete mode 100644 test/definitions/nrdot/oracle-otel/debian/ubuntu-22-oracle-otel.json delete mode 100644 test/definitions/nrdot/oracle-otel/rds-debian/ubuntu-22-oracle-otel-rds.json rename test/definitions/nrdot/oracle-otel/rhel/{centos-9-oracle-otel.json => rhel-9-oracle-otel.json} (86%) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml deleted file mode 100644 index 7a3343043..000000000 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml +++ /dev/null @@ -1,1007 +0,0 @@ -# Visit our schema definition for additional information on this file format. -# https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition - -name: nrdot-collector-oracle -displayName: NRDOT Oracle Database (Debian/Ubuntu) -description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector on Debian/Ubuntu self-hosted environments -repository: https://github.com/newrelic/nrdot-collector-releases - -installTargets: - - type: host - os: linux - platformFamily: debian - - type: host - os: linux - platform: ubuntu - -keywords: - - Oracle - - Oracle Database - - NRDOT - - OpenTelemetry - - OTel - - Database - - Linux - - Debian - - Ubuntu - -processMatch: - - tnslsnr - -preInstall: - discoveryMode: - - targeted - info: | - To capture data from Oracle Database, we need to create/authorize a monitoring - identity (a database user). This requires SYS/SYSDBA access on the account - running this installation. - -inputVars: - - name: NR_CLI_ORACLE_CONFIG_PRESET - prompt: "NRDOT configuration - 1) Database only 2) Host + Database: " - default: "1" - - name: NR_CLI_ORACLE_CONTAINER_TYPE - prompt: "Oracle container type - 1) CDB (monitor all PDBs) 2) PDB (single PDB): " - default: "1" - - name: NR_CLI_ORACLE_PDB_NAME - prompt: "PDB name (mode 2 only; leave blank for CDB mode): " - - name: NR_CLI_ORACLE_HOST - prompt: "Oracle Database host (e.g. localhost): " - default: "localhost" - - name: NR_CLI_ORACLE_PORT - prompt: "Oracle listener port: " - default: "1521" - - name: NR_CLI_ORACLE_SYS_PASSWORD - prompt: "SYS password (used once to create the monitoring user and grant privileges): " - secret: true - - name: NR_CLI_ORACLE_LOGIN_NAME - prompt: "Monitoring username (CDB mode creates it as c##): " - default: "newrelic" - - name: NR_CLI_ORACLE_LOGIN_PASSWORD - prompt: "Password for the monitoring login (leave blank to auto-generate a random password): " - secret: true - - name: NR_CLI_ORACLE_SERVICE_NAME - prompt: "CDB or PDB service name for the collector connection: " - -validationNrql: "SELECT count(*) FROM Metric WHERE metricName LIKE 'oracledb.%' AND instrumentation.provider = 'opentelemetry' SINCE 10 minutes ago" - -successLinkConfig: - type: EXPLORER - -install: - version: "3" - silent: true - - vars: - IS_SYSTEMCTL: - sh: command -v systemctl | wc -l - - tasks: - write_recipe_metadata: - cmds: - - | - echo '{"Metadata":{"CapturedCliOutput":"true"}}' | tee {{.NR_CLI_OUTPUT}} > /dev/null - - assert_pre_req: - cmds: - - | - if [ "$(id -u)" != "0" ]; then - echo "This newrelic install must be run under sudo or root" >&2 - exit 131 - fi - - | - if ! command -v curl > /dev/null 2>&1; then - echo "curl is required to run the newrelic install. Please install curl and re-run the installation." >&2 - exit 16 - fi - - | - if [ "{{.IS_SYSTEMCTL}}" -eq 0 ]; then - echo "systemd is required for the nrdot-collector service configuration." >&2 - exit 131 - fi - - assert_container_type_inputs: - cmds: - - | - CONTAINER_TYPE="{{.NR_CLI_ORACLE_CONTAINER_TYPE}}" - PDB_NAME="{{.NR_CLI_ORACLE_PDB_NAME}}" - - case "$CONTAINER_TYPE" in - 1) ;; - 2) - if [ -z "$PDB_NAME" ]; then - echo "NR_CLI_ORACLE_PDB_NAME is required when NR_CLI_ORACLE_CONTAINER_TYPE is 2 (PDB)." >&2 - exit 1 - fi - ;; - *) - echo "NR_CLI_ORACLE_CONTAINER_TYPE must be 1 (CDB) or 2 (PDB)." >&2 - exit 1 - ;; - esac - - assert_oracle_version: - cmds: - - | - HOST="{{.NR_CLI_ORACLE_HOST}}" - PORT="{{.NR_CLI_ORACLE_PORT}}" - SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" - SYS_PASSWORD="{{.NR_CLI_ORACLE_SYS_PASSWORD}}" - - VERSION_OUTPUT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << 'SQL' - WHENEVER SQLERROR EXIT SQL.SQLCODE - SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON - SELECT version FROM v$instance; - EXIT; - SQL - ) - if [ $? -ne 0 ]; then - echo "Failed to connect to Oracle Database to check its version:" >&2 - echo "$VERSION_OUTPUT" >&2 - exit 1 - fi - - MAJOR_VERSION=$(echo "$VERSION_OUTPUT" | grep -oE '^[0-9]+' | head -1) - - if [ -z "$MAJOR_VERSION" ] || [ "$MAJOR_VERSION" -lt 19 ]; then - echo "Oracle Database version ${MAJOR_VERSION:-unknown} is not supported. Oracle Database 19c or later is required." >&2 - exit 1 - fi - - echo "Oracle Database major version ${MAJOR_VERSION} detected - supported." - - install_nrdot: - cmds: - - | - COLLECTOR_DISTRO="nrdot-collector" - - if dpkg -l | grep -q "^ii.*${COLLECTOR_DISTRO} "; then - echo "NRDOT Collector is already installed." - echo "" - echo "Please follow the steps below to complete the setup:" - echo "" - echo " 1. Create oracle-config.yaml" - echo " if not present. Refer to:" - echo " https://docs.newrelic.com/docs/opentelemetry/database/otel-oracledb/" - echo "" - echo " 2. Make sure the monitoring user is created" - echo " and has the required permissions granted." - echo "" - echo " 3. After making the above changes, restart the NRDOT Collector:" - echo " sudo systemctl restart nrdot-collector" - echo "" - exit 131 - fi - - COLLECTOR_VERSION=$(curl -sf "https://api.github.com/repos/newrelic/nrdot-collector-releases/releases/latest" | grep '"tag_name":' | awk -F'"' '{print $4}') - if [ -z "$COLLECTOR_VERSION" ]; then - echo "Failed to fetch the latest release version from GitHub. Please check your internet connection." >&2 - exit 1 - fi - - if [ "$(uname -m)" = "aarch64" ]; then - ARCH="arm64" - else - ARCH="amd64" - fi - - DOWNLOAD_URL="https://github.com/newrelic/nrdot-collector-releases/releases/download/${COLLECTOR_VERSION}/${COLLECTOR_DISTRO}_${COLLECTOR_VERSION}_linux_${ARCH}.deb" - echo "Installing ${COLLECTOR_DISTRO} version: ${COLLECTOR_VERSION}" - echo "Downloading from: ${DOWNLOAD_URL}" - - curl -L --output /tmp/nrdot-collector.deb "$DOWNLOAD_URL" - if [ $? -ne 0 ]; then - echo "Failed to download the nrdot-collector package." >&2 - exit 1 - fi - - dpkg -i /tmp/nrdot-collector.deb - if [ $? -ne 0 ]; then - echo "Failed to install the nrdot-collector package." >&2 - exit 1 - fi - - rm -f /tmp/nrdot-collector.deb - echo "${COLLECTOR_DISTRO} installed successfully." - - configure_database_user: - cmds: - - | - CONTAINER_TYPE="{{.NR_CLI_ORACLE_CONTAINER_TYPE}}" - PDB_NAME="{{.NR_CLI_ORACLE_PDB_NAME}}" - LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" - HOST="{{.NR_CLI_ORACLE_HOST}}" - PORT="{{.NR_CLI_ORACLE_PORT}}" - SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" - SYS_PASSWORD="{{.NR_CLI_ORACLE_SYS_PASSWORD}}" - PW_FILE="/tmp/nr-oracle-newrelic-pw.tmp" - - if [ -z "{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" ]; then - NR_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24) - else - NR_PASSWORD="{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" - fi - printf '%s' "$NR_PASSWORD" > "$PW_FILE" - chmod 600 "$PW_FILE" - - if [ "$CONTAINER_TYPE" = "1" ]; then - RESULT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << SQL 2>&1 - WHENEVER SQLERROR EXIT SQL.SQLCODE - ALTER SESSION SET CONTAINER = CDB\$ROOT; - CREATE USER c##${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}" CONTAINER=ALL; - GRANT CREATE SESSION TO c##${LOGIN_NAME} CONTAINER=ALL; - ALTER USER c##${LOGIN_NAME} SET CONTAINER_DATA=ALL CONTAINER=CURRENT; - GRANT SELECT ON V_\$INSTANCE TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$DATABASE TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$CONTAINERS TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$DATAFILE TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SYSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$CON_SYSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SYSMETRIC TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$CON_SYSMETRIC TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SESSION TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$RESOURCE_LIMIT TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$OSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SGAINFO TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$ROWCACHE TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$PARAMETER TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON CDB_TABLESPACE_USAGE_METRICS TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON CDB_TABLESPACES TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON DBA_DATA_FILES TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON DBA_FREE_SPACE TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON DBA_RECYCLEBIN TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SQL TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SQL_PLAN TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$LOCK TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SESSION_EVENT TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON DBA_PROCEDURES TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON DBA_OBJECTS TO c##${LOGIN_NAME} CONTAINER=ALL; - EXIT; - SQL - ) - else - RESULT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << SQL 2>&1 - WHENEVER SQLERROR EXIT SQL.SQLCODE - ALTER SESSION SET CONTAINER = "${PDB_NAME}"; - CREATE USER ${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}"; - GRANT CREATE SESSION TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$INSTANCE TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$DATABASE TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$CONTAINERS TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$DATAFILE TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SYSSTAT TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SYSMETRIC TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SESSION TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$RESOURCE_LIMIT TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$OSSTAT TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SGAINFO TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$ROWCACHE TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$PARAMETER TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_TABLESPACE_USAGE_METRICS TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_TABLESPACES TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_DATA_FILES TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_FREE_SPACE TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_RECYCLEBIN TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SQL TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SQL_PLAN TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$LOCK TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SESSION_EVENT TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_PROCEDURES TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_OBJECTS TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$PDBS TO ${LOGIN_NAME}; - EXIT; - SQL - ) - fi - - if [ $? -ne 0 ]; then - echo "SQL script failed:" >&2 - echo "$RESULT" >&2 - exit 1 - fi - echo "$RESULT" - - echo "Oracle Database monitoring identity configured successfully." - - create_collector_config: - cmds: - - | - PRESET="{{.NR_CLI_ORACLE_CONFIG_PRESET}}" - CONTAINER_TYPE="{{.NR_CLI_ORACLE_CONTAINER_TYPE}}" - HOST="{{.NR_CLI_ORACLE_HOST}}" - PORT="{{.NR_CLI_ORACLE_PORT}}" - SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" - LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" - REGION="{{.NEW_RELIC_REGION}}" - LICENSE_KEY="{{.NEW_RELIC_LICENSE_KEY}}" - CONFIG_DIR="/etc/nrdot-collector" - CONFIG_PATH="${CONFIG_DIR}/oracle-config.yaml" - ENV_FILE="${CONFIG_DIR}/nrdot-collector.conf" - PW_FILE="/tmp/nr-oracle-newrelic-pw.tmp" - - mkdir -p "$CONFIG_DIR" - - NR_PASSWORD=$(cat "$PW_FILE") - - if [ "$CONTAINER_TYPE" = "1" ]; then - DB_USERNAME="c##${LOGIN_NAME}" - else - DB_USERNAME="${LOGIN_NAME}" - fi - - case "$REGION" in - staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net" ;; - EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net" ;; - JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net" ;; - *) OTLP_ENDPOINT="https://otlp.nr-data.net" ;; - esac - - if [ "$PRESET" = "2" ]; then - cat > "$CONFIG_PATH" << EOF - extensions: - health_check: - - receivers: - otlp: - protocols: - grpc: - http: - - hostmetrics: - collection_interval: 60s - scrapers: - cpu: - metrics: - system.cpu.time: - enabled: false - system.cpu.utilization: - enabled: true - load: - memory: - metrics: - system.memory.utilization: - enabled: true - paging: - metrics: - system.paging.utilization: - enabled: false - system.paging.faults: - enabled: false - filesystem: - metrics: - system.filesystem.utilization: - enabled: true - disk: - metrics: - system.disk.merged: - enabled: false - system.disk.pending_operations: - enabled: false - system.disk.weighted_io_time: - enabled: false - network: - metrics: - system.network.connections: - enabled: false - - filelog: - include: - - /var/log/alternatives.log - - /var/log/cloud-init.log - - /var/log/auth.log - - /var/log/dpkg.log - - /var/log/syslog - - /var/log/messages - - /var/log/secure - - /var/log/yum.log - - nroracledb: - endpoint: "${HOST}:${PORT}" - username: "${DB_USERNAME}" - password: "${NR_PASSWORD}" - service: "${SERVICE_NAME}" - collection_interval: 10s - events: - db.server.query_sample: - enabled: true - db.server.top_query: - enabled: true - db.server.session.wait_sample: - enabled: true - top_query_collection: - max_query_sample_count: 1000 - top_query_count: 200 - collection_interval: 60s - allowed_comment_keys: - - nr_service_guid - query_sample_collection: - max_rows_per_query: 100 - allowed_comment_keys: - - nr_service_guid - session_wait_event_collection: - max_rows_per_query: 100 - metrics: - EOF - else - cat > "$CONFIG_PATH" << EOF - receivers: - nroracledb: - endpoint: "${HOST}:${PORT}" - username: "${DB_USERNAME}" - password: "${NR_PASSWORD}" - service: "${SERVICE_NAME}" - collection_interval: 10s - events: - db.server.query_sample: - enabled: true - db.server.top_query: - enabled: true - db.server.session.wait_sample: - enabled: true - top_query_collection: - max_query_sample_count: 1000 - top_query_count: 200 - collection_interval: 60s - allowed_comment_keys: - - nr_service_guid - query_sample_collection: - max_rows_per_query: 100 - allowed_comment_keys: - - nr_service_guid - session_wait_event_collection: - max_rows_per_query: 100 - metrics: - EOF - fi - - cat >> "$CONFIG_PATH" << 'EOF' - oracledb.cpu_time: - enabled: true - attributes: - - oracle.db.pdb - oracledb.database.cpu.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.host.cpu.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.system.cpu.load: - enabled: true - oracledb.executions: - enabled: true - attributes: - - oracle.db.pdb - oracledb.execution.utilization: - enabled: true - attributes: - - oracledb.parse.type - - oracle.db.pdb - oracledb.parse_calls: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parse.rate: - enabled: true - attributes: - - oracledb.parse.result - - oracle.db.pdb - oracledb.parse.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.hard_parses: - enabled: true - attributes: - - oracle.db.pdb - oracledb.logical_reads: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_reads: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_reads_direct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_writes: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_writes_direct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_read_io_requests: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_write_io_requests: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_io.cache_writes: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_io.requests: - enabled: true - attributes: - - disk.io.direction - - disk.io.block_size - - oracle.db.pdb - oracledb.physical_io.transferred: - enabled: true - attributes: - - disk.io.direction - - disk.io.type - - oracle.db.pdb - oracledb.sqlnet.io.transferred: - enabled: true - attributes: - - network.io.direction - - destination.type - - oracle.db.pdb - oracledb.consistent_gets: - enabled: true - attributes: - - oracle.db.pdb - oracledb.db_block_gets: - enabled: true - attributes: - - oracle.db.pdb - oracledb.buffer_cache.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.library_cache.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.data_dictionary.hit_ratio: - enabled: true - oracledb.shared_pool.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.pga_memory: - enabled: true - attributes: - - oracle.db.pdb - oracledb.sga.limit: - enabled: true - oracledb.sga.usage: - enabled: true - attributes: - - oracledb.sga.component.name - oracledb.database.wait.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.dml_locks.limit: - enabled: true - oracledb.dml_locks.usage: - enabled: true - oracledb.enqueue_locks.limit: - enabled: true - oracledb.enqueue_locks.usage: - enabled: true - oracledb.enqueue_resources.limit: - enabled: true - oracledb.enqueue_resources.usage: - enabled: true - oracledb.enqueue_deadlocks: - enabled: true - attributes: - - oracle.db.pdb - oracledb.exchange_deadlocks: - enabled: true - attributes: - - oracle.db.pdb - oracledb.processes.limit: - enabled: true - oracledb.processes.usage: - enabled: true - oracledb.sessions.limit: - enabled: true - oracledb.sessions.usage: - enabled: true - attributes: - - session_type - - session_status - - oracle.db.pdb - oracledb.logons: - enabled: true - attributes: - - oracle.db.pdb - oracledb.transactions.limit: - enabled: true - oracledb.transactions.usage: - enabled: true - oracledb.user_commits: - enabled: true - attributes: - - oracle.db.pdb - oracledb.user_rollbacks: - enabled: true - attributes: - - oracle.db.pdb - oracledb.tablespace_size.limit: - enabled: true - attributes: - - tablespace_name - - oracle.db.pdb - oracledb.tablespace_size.usage: - enabled: true - attributes: - - tablespace_name - - oracle.db.pdb - oracledb.storage.usage: - enabled: true - oracledb.storage.utilization: - enabled: true - oracledb.recycle_bin.limit: - enabled: true - oracledb.queries_parallelized: - enabled: true - attributes: - - oracle.db.pdb - oracledb.ddl_statements_parallelized: - enabled: true - attributes: - - oracle.db.pdb - oracledb.dml_statements_parallelized: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_not_downgraded: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_downgraded_1_to_25_pct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_downgraded_25_to_50_pct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_downgraded_50_to_75_pct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_downgraded_75_to_99_pct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_downgraded_to_serial: - enabled: true - attributes: - - oracle.db.pdb - oracledb.redo_allocation.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.sort.ratio: - enabled: true - attributes: - - oracledb.sort.type - - oracle.db.pdb - oracledb.sql_service.response.duration: - enabled: true - attributes: - - oracle.db.pdb - resource_attributes: - host.name: - enabled: true - oracle.db.hosting_type: - enabled: true - oracle.db.open_mode: - enabled: true - oracle.db.pdb: - enabled: true - oracle.db.role: - enabled: true - oracle.db.version: - enabled: true - oracledb.instance.name: - enabled: true - service.instance.id: - enabled: true - EOF - - if [ "$PRESET" = "2" ]; then - cat >> "$CONFIG_PATH" << 'EOF' - - processors: - metricstransform: - transforms: - - include: system.cpu.utilization - action: update - operations: - - action: aggregate_labels - label_set: [state] - aggregation_type: mean - - include: system.paging.operations - action: update - operations: - - action: aggregate_labels - label_set: [direction] - aggregation_type: sum - - filter/exclude_cpu_utilization: - metrics: - datapoint: - - 'metric.name == "system.cpu.utilization" and attributes["state"] == "interrupt"' - - 'metric.name == "system.cpu.utilization" and attributes["state"] == "nice"' - - 'metric.name == "system.cpu.utilization" and attributes["state"] == "softirq"' - - filter/exclude_memory_utilization: - metrics: - datapoint: - - 'metric.name == "system.memory.utilization" and attributes["state"] == "slab_unreclaimable"' - - 'metric.name == "system.memory.utilization" and attributes["state"] == "inactive"' - - 'metric.name == "system.memory.utilization" and attributes["state"] == "cached"' - - 'metric.name == "system.memory.utilization" and attributes["state"] == "buffered"' - - 'metric.name == "system.memory.utilization" and attributes["state"] == "slab_reclaimable"' - - filter/exclude_memory_usage: - metrics: - datapoint: - - 'metric.name == "system.memory.usage" and attributes["state"] == "slab_unreclaimable"' - - 'metric.name == "system.memory.usage" and attributes["state"] == "inactive"' - - filter/exclude_filesystem_utilization: - metrics: - datapoint: - - 'metric.name == "system.filesystem.utilization" and attributes["type"] == "squashfs"' - - filter/exclude_filesystem_usage: - metrics: - datapoint: - - 'metric.name == "system.filesystem.usage" and attributes["type"] == "squashfs"' - - 'metric.name == "system.filesystem.usage" and attributes["state"] == "reserved"' - - filter/exclude_filesystem_inodes_usage: - metrics: - datapoint: - - 'metric.name == "system.filesystem.inodes.usage" and attributes["type"] == "squashfs"' - - 'metric.name == "system.filesystem.inodes.usage" and attributes["state"] == "reserved"' - - filter/exclude_system_disk: - metrics: - datapoint: - - 'metric.name == "system.disk.operations" and IsMatch(attributes["device"], "^loop.*") == true' - - 'metric.name == "system.disk.merged" and IsMatch(attributes["device"], "^loop.*") == true' - - 'metric.name == "system.disk.io" and IsMatch(attributes["device"], "^loop.*") == true' - - 'metric.name == "system.disk.io_time" and IsMatch(attributes["device"], "^loop.*") == true' - - 'metric.name == "system.disk.operation_time" and IsMatch(attributes["device"], "^loop.*") == true' - - filter/exclude_system_paging: - metrics: - datapoint: - - 'metric.name == "system.paging.usage" and attributes["state"] == "cached"' - - 'metric.name == "system.paging.operations" and attributes["type"] == "cached"' - - filter/exclude_network: - metrics: - datapoint: - - 'IsMatch(metric.name, "^system.network.*") == true and attributes["device"] == "lo"' - - attributes/exclude_system_paging: - include: - match_type: strict - metric_names: - - system.paging.operations - actions: - - key: type - action: delete - - transform/clear_metadata: - metric_statements: - - context: metric - statements: - - set(metric.description, "") - - set(metric.unit, "") - - transform/host: - metric_statements: - - context: metric - statements: - - set(metric.description, "") - - set(metric.unit, "") - - transform: - trace_statements: - - context: span - statements: - - truncate_all(span.attributes, 4095) - - truncate_all(resource.attributes, 4095) - log_statements: - - context: log - statements: - - truncate_all(log.attributes, 4095) - - truncate_all(resource.attributes, 4095) - EOF - - cat >> "$CONFIG_PATH" << EOF - - memory_limiter: - check_interval: 1s - limit_mib: \${env:NEW_RELIC_MEMORY_LIMIT_MIB:-100} - - batch: - - resource/add_event_name: - attributes: - - key: host.address - value: "${HOST}" - action: upsert - - resourcedetection: - detectors: ["system"] - system: - hostname_sources: ["os"] - resource_attributes: - host.id: - enabled: true - - resourcedetection/db_safe: - detectors: ["system"] - override: false - system: - hostname_sources: ["os"] - resource_attributes: - host.id: - enabled: true - - resourcedetection/cloud: - detectors: ["gcp", "ec2", "azure"] - timeout: 2s - override: true - - resourcedetection/env: - detectors: ["env"] - timeout: 2s - override: true - - exporters: - otlp: - endpoint: ${OTLP_ENDPOINT} - headers: - api-key: ${LICENSE_KEY} - compression: gzip - - service: - pipelines: - metrics/host: - receivers: [hostmetrics] - processors: - - memory_limiter - - metricstransform - - filter/exclude_cpu_utilization - - filter/exclude_memory_utilization - - filter/exclude_memory_usage - - filter/exclude_filesystem_utilization - - filter/exclude_filesystem_usage - - filter/exclude_filesystem_inodes_usage - - filter/exclude_system_disk - - filter/exclude_network - - attributes/exclude_system_paging - - transform/host - - resourcedetection - - resourcedetection/cloud - - resourcedetection/env - - batch - exporters: [otlp] - traces: - receivers: [otlp] - processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] - exporters: [otlp] - metrics: - receivers: [otlp] - processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] - exporters: [otlp] - logs: - receivers: [otlp] - processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] - exporters: [otlp] - metrics/oracledb: - receivers: [nroracledb] - processors: [resource/add_event_name, batch] - exporters: [otlp] - logs/oracledb: - receivers: [nroracledb] - processors: [resource/add_event_name, batch] - exporters: [otlp] - extensions: [health_check] - EOF - else - cat >> "$CONFIG_PATH" << EOF - - processors: - batch: - resource/add_event_name: - attributes: - - key: host.address - value: "${HOST}" - action: upsert - - exporters: - otlp/newrelic: - endpoint: ${OTLP_ENDPOINT} - headers: - api-key: ${LICENSE_KEY} - compression: gzip - retry_on_failure: - enabled: true - initial_interval: 5s - max_interval: 30s - max_elapsed_time: 300s - - service: - pipelines: - metrics/oracledb: - receivers: [nroracledb] - processors: [resource/add_event_name, batch] - exporters: [otlp/newrelic] - logs/oracledb: - receivers: [nroracledb] - processors: [resource/add_event_name, batch] - exporters: [otlp/newrelic] - EOF - fi - - cat > "$ENV_FILE" << EOF - OTELCOL_OPTIONS="--config=${CONFIG_PATH}" - EOF - - rm -f "$PW_FILE" - echo "Oracle OTel config written to ${CONFIG_PATH}" - echo "Env file written to ${ENV_FILE}" - - restart_nrdot: - cmds: - - | - systemctl restart nrdot-collector - - assert_nrdot_status_ok: - cmds: - - | - MAX_RETRIES=30 - TRIES=0 - echo "Waiting for NRDOT Collector to start..." - while [ $TRIES -lt $MAX_RETRIES ]; do - TRIES=$((TRIES + 1)) - if systemctl is-active --quiet nrdot-collector; then - echo "NRDOT Collector is running." - exit 0 - fi - sleep 2 - done - echo "NRDOT Collector did not start in time. Check logs:" >&2 - journalctl -u nrdot-collector --no-pager -n 50 >&2 - exit 31 - - default: - cmds: - - task: write_recipe_metadata - - task: assert_pre_req - - task: assert_container_type_inputs - - task: assert_oracle_version - - task: install_nrdot - - task: configure_database_user - - task: create_collector_config - - task: restart_nrdot - - task: assert_nrdot_status_ok - -postInstall: - info: |2 - Oracle OTel config: /etc/nrdot-collector/oracle-config.yaml - Env file: /etc/nrdot-collector/nrdot-collector.conf - Service status: systemctl status nrdot-collector - View logs: journalctl -u nrdot-collector -f - Restart service: sudo systemctl restart nrdot-collector diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml deleted file mode 100644 index c4329bb25..000000000 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ /dev/null @@ -1,644 +0,0 @@ -# Visit our schema definition for additional information on this file format. -# https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition - -name: nrdot-collector-oracle-rds -displayName: NRDOT Oracle Database (AWS RDS, Debian/Ubuntu collector host) -description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector against an AWS RDS Oracle instance, collector installed on Debian/Ubuntu -repository: https://github.com/newrelic/nrdot-collector-releases - -installTargets: - - type: host - os: linux - platformFamily: debian - - type: host - os: linux - platform: ubuntu - -keywords: - - Oracle - - Oracle Database - - RDS - - NRDOT - - OpenTelemetry - - OTel - - Database - - Linux - - Debian - - Ubuntu - -processMatch: [] - -preInstall: - discoveryMode: - - targeted - info: | - To capture data from your RDS Oracle Database, we need to create/authorize a - monitoring identity (a database user) using the RDS master user's credentials. - -inputVars: - - name: NR_CLI_ORACLE_HOST - prompt: "RDS Oracle endpoint: " - - name: NR_CLI_ORACLE_PORT - prompt: "Oracle listener port: " - default: "1521" - - name: NR_CLI_ORACLE_ADMIN_USER - prompt: "RDS master username (used once to create the monitoring user and grant privileges): " - - name: NR_CLI_ORACLE_ADMIN_PASSWORD - prompt: "RDS master password: " - secret: true - - name: NR_CLI_ORACLE_LOGIN_NAME - prompt: "Monitoring username: " - default: "newrelic" - - name: NR_CLI_ORACLE_LOGIN_PASSWORD - prompt: "Password for the monitoring login (leave blank to auto-generate a random password): " - secret: true - - name: NR_CLI_ORACLE_SERVICE_NAME - prompt: "RDS DB service name for the collector connection: " - -validationNrql: "SELECT count(*) FROM Metric WHERE metricName LIKE 'oracledb.%' AND instrumentation.provider = 'opentelemetry' SINCE 10 minutes ago" - -successLinkConfig: - type: EXPLORER - -install: - version: "3" - silent: true - - vars: - IS_SYSTEMCTL: - sh: command -v systemctl | wc -l - - tasks: - write_recipe_metadata: - cmds: - - | - echo '{"Metadata":{"CapturedCliOutput":"true"}}' | tee {{.NR_CLI_OUTPUT}} > /dev/null - - assert_pre_req: - cmds: - - | - if [ "$(id -u)" != "0" ]; then - echo "This newrelic install must be run under sudo or root" >&2 - exit 131 - fi - - | - if ! command -v curl > /dev/null 2>&1; then - echo "curl is required to run the newrelic install. Please install curl and re-run the installation." >&2 - exit 16 - fi - - | - if [ "{{.IS_SYSTEMCTL}}" -eq 0 ]; then - echo "systemd is required for the nrdot-collector service configuration." >&2 - exit 131 - fi - - assert_oracle_version: - cmds: - - | - HOST="{{.NR_CLI_ORACLE_HOST}}" - PORT="{{.NR_CLI_ORACLE_PORT}}" - SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" - ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" - ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" - - VERSION_OUTPUT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << 'SQL' - WHENEVER SQLERROR EXIT SQL.SQLCODE - SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON - SELECT version FROM v$instance; - EXIT; - SQL - ) - if [ $? -ne 0 ]; then - echo "Failed to connect to the RDS Oracle Database to check its version:" >&2 - echo "$VERSION_OUTPUT" >&2 - exit 1 - fi - - MAJOR_VERSION=$(echo "$VERSION_OUTPUT" | grep -oE '^[0-9]+' | head -1) - - if [ -z "$MAJOR_VERSION" ] || [ "$MAJOR_VERSION" -lt 19 ]; then - echo "Oracle Database version ${MAJOR_VERSION:-unknown} is not supported. Oracle Database 19c or later is required." >&2 - exit 1 - fi - - echo "Oracle Database major version ${MAJOR_VERSION} detected - supported." - - install_nrdot: - cmds: - - | - COLLECTOR_DISTRO="nrdot-collector" - - if dpkg -l | grep -q "^ii.*${COLLECTOR_DISTRO} "; then - echo "NRDOT Collector is already installed." - echo "" - echo "Please follow the steps below to complete the setup:" - echo "" - echo " 1. Create oracle-config.yaml" - echo " if not present. Refer to:" - echo " https://docs.newrelic.com/docs/opentelemetry/database/otel-oracledb/" - echo "" - echo " 2. Make sure the monitoring user is created" - echo " and has the required permissions granted." - echo "" - echo " 3. After making the above changes, restart the NRDOT Collector:" - echo " sudo systemctl restart nrdot-collector" - echo "" - exit 131 - fi - - COLLECTOR_VERSION=$(curl -sf "https://api.github.com/repos/newrelic/nrdot-collector-releases/releases/latest" | grep '"tag_name":' | awk -F'"' '{print $4}') - if [ -z "$COLLECTOR_VERSION" ]; then - echo "Failed to fetch the latest release version from GitHub. Please check your internet connection." >&2 - exit 1 - fi - - if [ "$(uname -m)" = "aarch64" ]; then - ARCH="arm64" - else - ARCH="amd64" - fi - - DOWNLOAD_URL="https://github.com/newrelic/nrdot-collector-releases/releases/download/${COLLECTOR_VERSION}/${COLLECTOR_DISTRO}_${COLLECTOR_VERSION}_linux_${ARCH}.deb" - echo "Installing ${COLLECTOR_DISTRO} version: ${COLLECTOR_VERSION}" - echo "Downloading from: ${DOWNLOAD_URL}" - - curl -L --output /tmp/nrdot-collector.deb "$DOWNLOAD_URL" - if [ $? -ne 0 ]; then - echo "Failed to download the nrdot-collector package." >&2 - exit 1 - fi - - dpkg -i /tmp/nrdot-collector.deb - if [ $? -ne 0 ]; then - echo "Failed to install the nrdot-collector package." >&2 - exit 1 - fi - - rm -f /tmp/nrdot-collector.deb - echo "${COLLECTOR_DISTRO} installed successfully." - - configure_database_user: - cmds: - - | - LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" - LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') - HOST="{{.NR_CLI_ORACLE_HOST}}" - PORT="{{.NR_CLI_ORACLE_PORT}}" - SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" - ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" - ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" - PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" - - if [ -z "{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" ]; then - NR_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24) - else - NR_PASSWORD="{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" - fi - printf '%s' "$NR_PASSWORD" > "$PW_FILE" - chmod 600 "$PW_FILE" - - RESULT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << SQL 2>&1 - WHENEVER SQLERROR EXIT SQL.SQLCODE - CREATE USER ${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}"; - GRANT CONNECT TO ${LOGIN_NAME}; - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SYSMETRIC', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CON_SYSMETRIC', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CONTAINERS', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SESSION', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SESSION_EVENT', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SYSSTAT', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CON_SYSSTAT', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$OSSTAT', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SGAINFO', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQL', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQLSTATS', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQL_PLAN', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$PARAMETER', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$ROWCACHE', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$RESOURCE_LIMIT', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$LOCK', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$DATABASE', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$INSTANCE', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$DATAFILE', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$PDBS', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_DATA_FILES', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_FREE_SPACE', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_RECYCLEBIN', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACE_USAGE_METRICS', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_PROCEDURES', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_OBJECTS', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_TABLESPACE_USAGE_METRICS', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_TABLESPACES', '${LOGIN_UPPER}', 'SELECT', false); - EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_SERVICES', '${LOGIN_UPPER}', 'SELECT', false); - GRANT CREATE SESSION TO ${LOGIN_UPPER}; - EXIT; - SQL - ) - - if [ $? -ne 0 ]; then - echo "SQL script failed:" >&2 - echo "$RESULT" >&2 - exit 1 - fi - echo "$RESULT" - - echo "RDS Oracle Database monitoring identity configured successfully." - - create_collector_config: - cmds: - - | - HOST="{{.NR_CLI_ORACLE_HOST}}" - PORT="{{.NR_CLI_ORACLE_PORT}}" - SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" - LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" - REGION="{{.NEW_RELIC_REGION}}" - LICENSE_KEY="{{.NEW_RELIC_LICENSE_KEY}}" - CONFIG_DIR="/etc/nrdot-collector" - CONFIG_PATH="${CONFIG_DIR}/oracle-config.yaml" - ENV_FILE="${CONFIG_DIR}/nrdot-collector.conf" - PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" - - mkdir -p "$CONFIG_DIR" - - NR_PASSWORD=$(cat "$PW_FILE") - - case "$REGION" in - staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net" ;; - EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net" ;; - JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net" ;; - *) OTLP_ENDPOINT="https://otlp.nr-data.net" ;; - esac - - cat > "$CONFIG_PATH" << EOF - receivers: - nroracledb: - endpoint: "${HOST}:${PORT}" - username: "${LOGIN_NAME}" - password: "${NR_PASSWORD}" - service: "${SERVICE_NAME}" - collection_interval: 10s - events: - db.server.query_sample: - enabled: true - db.server.top_query: - enabled: true - db.server.session.wait_sample: - enabled: true - top_query_collection: - max_query_sample_count: 1000 - top_query_count: 200 - collection_interval: 60s - allowed_comment_keys: - - nr_service_guid - query_sample_collection: - max_rows_per_query: 100 - allowed_comment_keys: - - nr_service_guid - session_wait_event_collection: - max_rows_per_query: 100 - metrics: - EOF - - cat >> "$CONFIG_PATH" << 'EOF' - oracledb.cpu_time: - enabled: true - attributes: - - oracle.db.pdb - oracledb.database.cpu.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.host.cpu.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.system.cpu.load: - enabled: true - oracledb.executions: - enabled: true - attributes: - - oracle.db.pdb - oracledb.execution.utilization: - enabled: true - attributes: - - oracledb.parse.type - - oracle.db.pdb - oracledb.parse_calls: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parse.rate: - enabled: true - attributes: - - oracledb.parse.result - - oracle.db.pdb - oracledb.parse.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.hard_parses: - enabled: true - attributes: - - oracle.db.pdb - oracledb.logical_reads: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_reads: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_reads_direct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_writes: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_writes_direct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_read_io_requests: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_write_io_requests: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_io.cache_writes: - enabled: true - attributes: - - oracle.db.pdb - oracledb.physical_io.requests: - enabled: true - attributes: - - disk.io.direction - - disk.io.block_size - - oracle.db.pdb - oracledb.physical_io.transferred: - enabled: true - attributes: - - disk.io.direction - - disk.io.type - - oracle.db.pdb - oracledb.sqlnet.io.transferred: - enabled: true - attributes: - - network.io.direction - - destination.type - - oracle.db.pdb - oracledb.consistent_gets: - enabled: true - attributes: - - oracle.db.pdb - oracledb.db_block_gets: - enabled: true - attributes: - - oracle.db.pdb - oracledb.buffer_cache.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.library_cache.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.data_dictionary.hit_ratio: - enabled: true - oracledb.shared_pool.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.pga_memory: - enabled: true - attributes: - - oracle.db.pdb - oracledb.sga.limit: - enabled: true - oracledb.sga.usage: - enabled: true - attributes: - - oracledb.sga.component.name - oracledb.database.wait.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.dml_locks.limit: - enabled: true - oracledb.dml_locks.usage: - enabled: true - oracledb.enqueue_locks.limit: - enabled: true - oracledb.enqueue_locks.usage: - enabled: true - oracledb.enqueue_resources.limit: - enabled: true - oracledb.enqueue_resources.usage: - enabled: true - oracledb.enqueue_deadlocks: - enabled: true - attributes: - - oracle.db.pdb - oracledb.exchange_deadlocks: - enabled: true - attributes: - - oracle.db.pdb - oracledb.processes.limit: - enabled: true - oracledb.processes.usage: - enabled: true - oracledb.sessions.limit: - enabled: true - oracledb.sessions.usage: - enabled: true - attributes: - - session_type - - session_status - - oracle.db.pdb - oracledb.logons: - enabled: true - attributes: - - oracle.db.pdb - oracledb.transactions.limit: - enabled: true - oracledb.transactions.usage: - enabled: true - oracledb.user_commits: - enabled: true - attributes: - - oracle.db.pdb - oracledb.user_rollbacks: - enabled: true - attributes: - - oracle.db.pdb - oracledb.tablespace_size.limit: - enabled: true - attributes: - - tablespace_name - - oracle.db.pdb - oracledb.tablespace_size.usage: - enabled: true - attributes: - - tablespace_name - - oracle.db.pdb - oracledb.storage.usage: - enabled: true - oracledb.storage.utilization: - enabled: true - oracledb.recycle_bin.limit: - enabled: true - oracledb.queries_parallelized: - enabled: true - attributes: - - oracle.db.pdb - oracledb.ddl_statements_parallelized: - enabled: true - attributes: - - oracle.db.pdb - oracledb.dml_statements_parallelized: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_not_downgraded: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_downgraded_1_to_25_pct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_downgraded_25_to_50_pct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_downgraded_50_to_75_pct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_downgraded_75_to_99_pct: - enabled: true - attributes: - - oracle.db.pdb - oracledb.parallel_operations_downgraded_to_serial: - enabled: true - attributes: - - oracle.db.pdb - oracledb.redo_allocation.utilization: - enabled: true - attributes: - - oracle.db.pdb - oracledb.sort.ratio: - enabled: true - attributes: - - oracledb.sort.type - - oracle.db.pdb - oracledb.sql_service.response.duration: - enabled: true - attributes: - - oracle.db.pdb - resource_attributes: - host.name: - enabled: true - oracle.db.hosting_type: - enabled: true - oracle.db.open_mode: - enabled: true - oracle.db.pdb: - enabled: true - oracle.db.role: - enabled: true - oracle.db.version: - enabled: true - oracledb.instance.name: - enabled: true - service.instance.id: - enabled: true - EOF - - cat >> "$CONFIG_PATH" << EOF - - processors: - batch: - resource/add_event_name: - attributes: - - key: host.address - value: "${HOST}" - action: upsert - - exporters: - otlp/newrelic: - endpoint: ${OTLP_ENDPOINT} - headers: - api-key: ${LICENSE_KEY} - compression: gzip - retry_on_failure: - enabled: true - initial_interval: 5s - max_interval: 30s - max_elapsed_time: 300s - - service: - pipelines: - metrics/oracledb: - receivers: [nroracledb] - processors: [resource/add_event_name, batch] - exporters: [otlp/newrelic] - logs/oracledb: - receivers: [nroracledb] - processors: [resource/add_event_name, batch] - exporters: [otlp/newrelic] - EOF - - cat > "$ENV_FILE" << EOF - OTELCOL_OPTIONS="--config=${CONFIG_PATH}" - EOF - - rm -f "$PW_FILE" - echo "Oracle OTel config written to ${CONFIG_PATH}" - echo "Env file written to ${ENV_FILE}" - - restart_nrdot: - cmds: - - | - systemctl restart nrdot-collector - - assert_nrdot_status_ok: - cmds: - - | - MAX_RETRIES=30 - TRIES=0 - echo "Waiting for NRDOT Collector to start..." - while [ $TRIES -lt $MAX_RETRIES ]; do - TRIES=$((TRIES + 1)) - if systemctl is-active --quiet nrdot-collector; then - echo "NRDOT Collector is running." - exit 0 - fi - sleep 2 - done - echo "NRDOT Collector did not start in time. Check logs:" >&2 - journalctl -u nrdot-collector --no-pager -n 50 >&2 - exit 31 - - default: - cmds: - - task: write_recipe_metadata - - task: assert_pre_req - - task: assert_oracle_version - - task: install_nrdot - - task: configure_database_user - - task: create_collector_config - - task: restart_nrdot - - task: assert_nrdot_status_ok - -postInstall: - info: |2 - Oracle OTel config: /etc/nrdot-collector/oracle-config.yaml - Env file: /etc/nrdot-collector/nrdot-collector.conf - Service status: systemctl status nrdot-collector - View logs: journalctl -u nrdot-collector -f - Restart service: sudo systemctl restart nrdot-collector diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index 310b2febf..4cf842cf2 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -2,20 +2,21 @@ # https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition name: nrdot-collector-oracle -displayName: NRDOT Oracle Database (RHEL/CentOS/OEL) -description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector on RHEL/CentOS/OEL self-hosted environments +displayName: NRDOT Oracle Database (RHEL/OEL) +description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector on RHEL/OEL self-hosted environments repository: https://github.com/newrelic/nrdot-collector-releases installTargets: - type: host os: linux - platform: centos + platform: "redhat" + platformFamily: rhel + platformVersion: "((7|8|9)\\.?.*)" - type: host os: linux - platform: redhat - - type: host - os: linux - platform: oracle + platform: "oracle" + platformFamily: rhel + platformVersion: "((7|8|9)\\.?.*)" keywords: - Oracle @@ -25,7 +26,6 @@ keywords: - OTel - Database - Linux - - CentOS - RHEL - OEL @@ -41,14 +41,14 @@ preInstall: running this installation. inputVars: - - name: NR_CLI_ORACLE_CONFIG_PRESET - prompt: "NRDOT configuration - 1) Database only 2) Host + Database: " - default: "1" - name: NR_CLI_ORACLE_CONTAINER_TYPE prompt: "Oracle container type - 1) CDB (monitor all PDBs) 2) PDB (single PDB): " default: "1" - name: NR_CLI_ORACLE_PDB_NAME prompt: "PDB name (mode 2 only; leave blank for CDB mode): " + - name: NR_CLI_ORACLE_CONFIG_PRESET + prompt: "NRDOT configuration - 1) Database only 2) Host + Database: " + default: "1" - name: NR_CLI_ORACLE_HOST prompt: "Oracle Database host (e.g. localhost): " default: "localhost" diff --git a/test/definitions/nrdot/oracle-otel/debian/ubuntu-22-oracle-otel.json b/test/definitions/nrdot/oracle-otel/debian/ubuntu-22-oracle-otel.json deleted file mode 100644 index a4e9005c8..000000000 --- a/test/definitions/nrdot/oracle-otel/debian/ubuntu-22-oracle-otel.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "global_tags": { - "owning_team": "database-integrations", - "Environment": "development", - "Department": "product", - "Product": "database-integrations" - }, - "resources": [ - { - "id": "host1", - "provider": "aws", - "type": "ec2", - "size": "t3.medium", - "ami_name": "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*", - "user_name": "ubuntu" - } - ], - "instrumentations": { - "resources": [ - { - "id": "oracleotelubuntu", - "resource_ids": ["host1"], - "source_repository": "https://github.com/newrelic/open-install-library.git", - "deploy_script_path": "test/deploy/linux/newrelic-cli/install-recipe/roles", - "params": { - "recipe_content_url": "https://raw.githubusercontent.com/newrelic/open-install-library/main/recipes/newrelic/infrastructure/nrdot/oracle-otel/debian.yml", - "recipe_targeted": "nrdot-collector-oracle", - "validate_output": "NRDOT Oracle Database \\(Debian/Ubuntu\\)\\s+\\(installed\\)", - "env_var": "NEW_RELIC_CLI_SKIP_CORE=1 NR_CLI_ORACLE_CONFIG_PRESET=1 NR_CLI_ORACLE_CONTAINER_TYPE=1 NR_CLI_ORACLE_HOST=localhost NR_CLI_ORACLE_PORT=1521 NR_CLI_ORACLE_SYS_PASSWORD=[credential:secrets:nrOracleSysPassword] NR_CLI_ORACLE_SERVICE_NAME=[credential:secrets:nrOracleCdbServiceName]" - }, - "provider": "newrelic" - } - ] - } -} diff --git a/test/definitions/nrdot/oracle-otel/rds-debian/ubuntu-22-oracle-otel-rds.json b/test/definitions/nrdot/oracle-otel/rds-debian/ubuntu-22-oracle-otel-rds.json deleted file mode 100644 index edf8be088..000000000 --- a/test/definitions/nrdot/oracle-otel/rds-debian/ubuntu-22-oracle-otel-rds.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "global_tags": { - "owning_team": "database-integrations", - "Environment": "development", - "Department": "product", - "Product": "database-integrations" - }, - "resources": [ - { - "id": "host1", - "provider": "aws", - "type": "ec2", - "size": "t3.medium", - "ami_name": "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*", - "user_name": "ubuntu" - } - ], - "instrumentations": { - "resources": [ - { - "id": "oracleotelrdsubuntu", - "resource_ids": ["host1"], - "source_repository": "https://github.com/newrelic/open-install-library.git", - "deploy_script_path": "test/deploy/linux/newrelic-cli/install-recipe/roles", - "params": { - "recipe_content_url": "https://raw.githubusercontent.com/newrelic/open-install-library/main/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml", - "recipe_targeted": "nrdot-collector-oracle-rds", - "validate_output": "NRDOT Oracle Database \\(AWS RDS, Debian/Ubuntu collector host\\)\\s+\\(installed\\)", - "env_var": "NEW_RELIC_CLI_SKIP_CORE=1 NR_CLI_ORACLE_HOST=[credential:secrets:nrOracleRdsEndpoint] NR_CLI_ORACLE_PORT=1521 NR_CLI_ORACLE_ADMIN_USER=[credential:secrets:nrOracleRdsAdminUser] NR_CLI_ORACLE_ADMIN_PASSWORD=[credential:secrets:nrOracleRdsAdminPassword] NR_CLI_ORACLE_SERVICE_NAME=[credential:secrets:nrOracleRdsServiceName]" - }, - "provider": "newrelic" - } - ] - } -} diff --git a/test/definitions/nrdot/oracle-otel/rhel/centos-9-oracle-otel.json b/test/definitions/nrdot/oracle-otel/rhel/rhel-9-oracle-otel.json similarity index 86% rename from test/definitions/nrdot/oracle-otel/rhel/centos-9-oracle-otel.json rename to test/definitions/nrdot/oracle-otel/rhel/rhel-9-oracle-otel.json index e0884aada..5a00e3cd7 100644 --- a/test/definitions/nrdot/oracle-otel/rhel/centos-9-oracle-otel.json +++ b/test/definitions/nrdot/oracle-otel/rhel/rhel-9-oracle-otel.json @@ -11,21 +11,21 @@ "provider": "aws", "type": "ec2", "size": "t3.medium", - "ami_name": "CentOS Stream 9 x86_64*", + "ami_name": "RHEL-9.*_HVM-????????-x86_64-?-Hourly2-GP3", "user_name": "ec2-user" } ], "instrumentations": { "resources": [ { - "id": "oracleotelcentos", + "id": "oracleotelrhel", "resource_ids": ["host1"], "source_repository": "https://github.com/newrelic/open-install-library.git", "deploy_script_path": "test/deploy/linux/newrelic-cli/install-recipe/roles", "params": { "recipe_content_url": "https://raw.githubusercontent.com/newrelic/open-install-library/main/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml", "recipe_targeted": "nrdot-collector-oracle", - "validate_output": "NRDOT Oracle Database \\(RHEL/CentOS/OEL\\)\\s+\\(installed\\)", + "validate_output": "NRDOT Oracle Database \\(RHEL/OEL\\)\\s+\\(installed\\)", "env_var": "NEW_RELIC_CLI_SKIP_CORE=1 NR_CLI_ORACLE_CONFIG_PRESET=1 NR_CLI_ORACLE_CONTAINER_TYPE=1 NR_CLI_ORACLE_HOST=localhost NR_CLI_ORACLE_PORT=1521 NR_CLI_ORACLE_SYS_PASSWORD=[credential:secrets:nrOracleSysPassword] NR_CLI_ORACLE_SERVICE_NAME=[credential:secrets:nrOracleCdbServiceName]" }, "provider": "newrelic" From bca491ac3cdc3e11210a43ee0d02c8fc15e2d056 Mon Sep 17 00:00:00 2001 From: rreddy Date: Thu, 6 Aug 2026 10:33:50 +0530 Subject: [PATCH 15/33] drop tnslsnr processMatch gate from rhel.yml --- recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index 4cf842cf2..6e981a112 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -29,8 +29,7 @@ keywords: - RHEL - OEL -processMatch: - - tnslsnr +processMatch: [] preInstall: discoveryMode: From ca336c28301677a78c015999fb1725e6f237fac6 Mon Sep 17 00:00:00 2001 From: rreddy Date: Thu, 6 Aug 2026 10:51:00 +0530 Subject: [PATCH 16/33] changed installTargets --- .../newrelic/infrastructure/nrdot/oracle-otel/rhel.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index 6e981a112..a77dc14ce 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -9,14 +9,10 @@ repository: https://github.com/newrelic/nrdot-collector-releases installTargets: - type: host os: linux - platform: "redhat" - platformFamily: rhel - platformVersion: "((7|8|9)\\.?.*)" + platform: redhat - type: host os: linux - platform: "oracle" - platformFamily: rhel - platformVersion: "((7|8|9)\\.?.*)" + platform: oracle keywords: - Oracle From 96f852be532acf399cce308b47280bee6a6583f1 Mon Sep 17 00:00:00 2001 From: rreddy Date: Thu, 6 Aug 2026 11:22:10 +0530 Subject: [PATCH 17/33] reverted changes installTargets --- .../newrelic/infrastructure/nrdot/oracle-otel/rhel.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index a77dc14ce..6e981a112 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -9,10 +9,14 @@ repository: https://github.com/newrelic/nrdot-collector-releases installTargets: - type: host os: linux - platform: redhat + platform: "redhat" + platformFamily: rhel + platformVersion: "((7|8|9)\\.?.*)" - type: host os: linux - platform: oracle + platform: "oracle" + platformFamily: rhel + platformVersion: "((7|8|9)\\.?.*)" keywords: - Oracle From abbc672d0af3c43eadbfc213361570f384e3a62b Mon Sep 17 00:00:00 2001 From: rreddy Date: Thu, 6 Aug 2026 13:02:47 +0530 Subject: [PATCH 18/33] switch rhel.yml to SSH + OS-authenticated SYSDBA --- .../infrastructure/nrdot/oracle-otel/rhel.yml | 223 ++++++++++-------- 1 file changed, 121 insertions(+), 102 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index 6e981a112..36e1777da 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -36,8 +36,11 @@ preInstall: - targeted info: | To capture data from Oracle Database, we need to create/authorize a monitoring - identity (a database user). This requires SYS/SYSDBA access on the account - running this installation. + identity (a database user). Since no SYS password is collected, this is done via + SSH into the Oracle Database host and OS-authenticated SYSDBA access (sudo su - + oracle -c 'sqlplus / as sysdba'). Connect to this host with SSH agent forwarding + (ssh -A) so the forwarded key can be reused to reach the Database host, and make + sure the SSH user can run 'sudo su - oracle' without a password prompt. inputVars: - name: NR_CLI_ORACLE_CONTAINER_TYPE @@ -54,9 +57,9 @@ inputVars: - name: NR_CLI_ORACLE_PORT prompt: "Oracle listener port: " default: "1521" - - name: NR_CLI_ORACLE_SYS_PASSWORD - prompt: "SYS password (used once to create the monitoring user and grant privileges): " - secret: true + - name: NR_CLI_ORACLE_SSH_USER + prompt: "SSH user for the Oracle Database host (used once to create the monitoring user and grant privileges): " + default: "opc" - name: NR_CLI_ORACLE_LOGIN_NAME prompt: "Monitoring username (CDB mode creates it as c##): " default: "newrelic" @@ -127,20 +130,28 @@ install: cmds: - | HOST="{{.NR_CLI_ORACLE_HOST}}" - PORT="{{.NR_CLI_ORACLE_PORT}}" - SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" - SYS_PASSWORD="{{.NR_CLI_ORACLE_SYS_PASSWORD}}" - - VERSION_OUTPUT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << 'SQL' - WHENEVER SQLERROR EXIT SQL.SQLCODE - SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON - SELECT version FROM v$instance; - EXIT; - SQL - ) - if [ $? -ne 0 ]; then - echo "Failed to connect to Oracle Database to check its version:" >&2 + SSH_USER="{{.NR_CLI_ORACLE_SSH_USER}}" + + if [ -z "${SSH_AUTH_SOCK:-}" ]; then + SSH_AUTH_SOCK=$(ls /tmp/ssh-*/agent.* 2>/dev/null | head -1) + export SSH_AUTH_SOCK + fi + if [ -z "${SSH_AUTH_SOCK:-}" ]; then + echo "SSH agent socket not found." >&2 + echo "Please connect to this host using SSH agent forwarding: ssh -A @" >&2 + exit 131 + fi + + VERSION_OUTPUT=$(ssh -o StrictHostKeyChecking=no -o BatchMode=yes "${SSH_USER}@${HOST}" \ + "printf 'SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON\nSELECT version FROM v\$instance;\nEXIT;\n' | sudo su - oracle -c 'sqlplus -S / as sysdba'") + + if [ -z "$VERSION_OUTPUT" ] || echo "$VERSION_OUTPUT" | grep -qi "ORA-\|error"; then + echo "Failed to connect to Oracle Database via SSH to check its version:" >&2 echo "$VERSION_OUTPUT" >&2 + echo "Please verify:" >&2 + echo " - SSH access is available: ssh ${SSH_USER}@${HOST}" >&2 + echo " - The SSH user can run 'sudo su - oracle' without a password prompt" >&2 + echo " - The Oracle listener is running on the Database host" >&2 exit 1 fi @@ -214,10 +225,76 @@ install: PDB_NAME="{{.NR_CLI_ORACLE_PDB_NAME}}" LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" HOST="{{.NR_CLI_ORACLE_HOST}}" - PORT="{{.NR_CLI_ORACLE_PORT}}" - SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" - SYS_PASSWORD="{{.NR_CLI_ORACLE_SYS_PASSWORD}}" + SSH_USER="{{.NR_CLI_ORACLE_SSH_USER}}" PW_FILE="/tmp/nr-oracle-newrelic-pw.tmp" + USER_FILE="/tmp/nr-oracle-db-user.tmp" + + if [ -z "${SSH_AUTH_SOCK:-}" ]; then + SSH_AUTH_SOCK=$(ls /tmp/ssh-*/agent.* 2>/dev/null | head -1) + export SSH_AUTH_SOCK + fi + if [ -z "${SSH_AUTH_SOCK:-}" ]; then + echo "SSH agent socket not found." >&2 + echo "Please connect to this host using SSH agent forwarding: ssh -A @" >&2 + exit 131 + fi + + if [ "$CONTAINER_TYPE" = "1" ]; then + DB_USER="c##${LOGIN_NAME}" + SET_CONTAINER="ALTER SESSION SET CONTAINER = CDB\$ROOT;" + else + DB_USER="${LOGIN_NAME}" + SET_CONTAINER="ALTER SESSION SET CONTAINER = \"${PDB_NAME}\";" + fi + + DB_USER_UPPER=$(echo "$DB_USER" | tr '[:lower:]' '[:upper:]') + EXISTS_RESULT=$(ssh -o StrictHostKeyChecking=no -o BatchMode=yes "${SSH_USER}@${HOST}" \ + "printf 'SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF\n${SET_CONTAINER}\nSELECT username FROM dba_users WHERE username='\"'\"'${DB_USER_UPPER}'\"'\"';\nEXIT;\n' | sudo su - oracle -c 'sqlplus -S / as sysdba'") || true + + if echo "$EXISTS_RESULT" | grep -qi "^[[:space:]]*${DB_USER_UPPER}[[:space:]]*$"; then + echo "" + echo "Monitoring user $DB_USER already exists." + echo "" + echo "What would you like to do?" + echo " 1. Use the existing user $DB_USER (you will be asked for the password)" + echo " 2. Create a new username" + echo "" + read -rp "Enter your choice (1 or 2): " USER_CHOICE + + case "$USER_CHOICE" in + 1) + echo "" + stty -echo + read -rp "Enter the existing password for $DB_USER: " NR_PASSWORD + stty echo + echo "" + printf '%s' "$NR_PASSWORD" > "$PW_FILE" + chmod 600 "$PW_FILE" + echo "$DB_USER" > "$USER_FILE" + chmod 600 "$USER_FILE" + echo "Using existing user: $DB_USER" + exit 0 + ;; + 2) + echo "" + echo " Note: Just type the name without the c## prefix in CDB mode; it will be added automatically." + read -rp "Enter new monitoring username: " NEW_USERNAME + LOGIN_NAME="$NEW_USERNAME" + if [ "$CONTAINER_TYPE" = "1" ]; then + DB_USER="c##${LOGIN_NAME}" + else + DB_USER="${LOGIN_NAME}" + fi + ;; + *) + echo "Invalid choice. Please re-run and enter 1 or 2." >&2 + exit 131 + ;; + esac + fi + + echo "$DB_USER" > "$USER_FILE" + chmod 600 "$USER_FILE" if [ -z "{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" ]; then NR_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24) @@ -228,109 +305,42 @@ install: chmod 600 "$PW_FILE" if [ "$CONTAINER_TYPE" = "1" ]; then - RESULT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << SQL 2>&1 - WHENEVER SQLERROR EXIT SQL.SQLCODE - ALTER SESSION SET CONTAINER = CDB\$ROOT; - CREATE USER c##${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}" CONTAINER=ALL; - GRANT CREATE SESSION TO c##${LOGIN_NAME} CONTAINER=ALL; - ALTER USER c##${LOGIN_NAME} SET CONTAINER_DATA=ALL CONTAINER=CURRENT; - GRANT SELECT ON V_\$INSTANCE TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$DATABASE TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$CONTAINERS TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$DATAFILE TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SYSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$CON_SYSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SYSMETRIC TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$CON_SYSMETRIC TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SESSION TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$RESOURCE_LIMIT TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$OSSTAT TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SGAINFO TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$ROWCACHE TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$PARAMETER TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON CDB_TABLESPACE_USAGE_METRICS TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON CDB_TABLESPACES TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON DBA_DATA_FILES TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON DBA_FREE_SPACE TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON DBA_RECYCLEBIN TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SQL TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SQL_PLAN TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$LOCK TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON V_\$SESSION_EVENT TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON DBA_PROCEDURES TO c##${LOGIN_NAME} CONTAINER=ALL; - GRANT SELECT ON DBA_OBJECTS TO c##${LOGIN_NAME} CONTAINER=ALL; - EXIT; - SQL - ) + RESULT=$(ssh -o StrictHostKeyChecking=no -o BatchMode=yes "${SSH_USER}@${HOST}" \ + "printf 'WHENEVER SQLERROR EXIT SQL.SQLCODE\nALTER SESSION SET CONTAINER = CDB\$ROOT;\nCREATE USER ${DB_USER} IDENTIFIED BY \"${NR_PASSWORD}\" CONTAINER=ALL;\nGRANT CREATE SESSION TO ${DB_USER} CONTAINER=ALL;\nALTER USER ${DB_USER} SET CONTAINER_DATA=ALL CONTAINER=CURRENT;\nGRANT SELECT ON V_\$INSTANCE TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$DATABASE TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$CONTAINERS TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$DATAFILE TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SYSSTAT TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$CON_SYSSTAT TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SYSMETRIC TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$CON_SYSMETRIC TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SESSION TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$RESOURCE_LIMIT TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$OSSTAT TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SGAINFO TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$ROWCACHE TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$PARAMETER TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON CDB_TABLESPACE_USAGE_METRICS TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON CDB_TABLESPACES TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON DBA_DATA_FILES TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON DBA_FREE_SPACE TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON DBA_RECYCLEBIN TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SQL TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SQL_PLAN TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$LOCK TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SESSION_EVENT TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON DBA_PROCEDURES TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON DBA_OBJECTS TO ${DB_USER} CONTAINER=ALL;\nEXIT;\n' | sudo su - oracle -c 'sqlplus -S / as sysdba'" 2>&1) else - RESULT=$(sqlplus -S "sys/${SYS_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" AS SYSDBA << SQL 2>&1 - WHENEVER SQLERROR EXIT SQL.SQLCODE - ALTER SESSION SET CONTAINER = "${PDB_NAME}"; - CREATE USER ${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}"; - GRANT CREATE SESSION TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$INSTANCE TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$DATABASE TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$CONTAINERS TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$DATAFILE TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SYSSTAT TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SYSMETRIC TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SESSION TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$RESOURCE_LIMIT TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$OSSTAT TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SGAINFO TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$ROWCACHE TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$PARAMETER TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_TABLESPACE_USAGE_METRICS TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_TABLESPACES TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_DATA_FILES TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_FREE_SPACE TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_RECYCLEBIN TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SQL TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SQL_PLAN TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$LOCK TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$SESSION_EVENT TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_PROCEDURES TO ${LOGIN_NAME}; - GRANT SELECT ON DBA_OBJECTS TO ${LOGIN_NAME}; - GRANT SELECT ON V_\$PDBS TO ${LOGIN_NAME}; - EXIT; - SQL - ) + RESULT=$(ssh -o StrictHostKeyChecking=no -o BatchMode=yes "${SSH_USER}@${HOST}" \ + "printf 'WHENEVER SQLERROR EXIT SQL.SQLCODE\nALTER SESSION SET CONTAINER = \"${PDB_NAME}\";\nCREATE USER ${DB_USER} IDENTIFIED BY \"${NR_PASSWORD}\";\nGRANT CREATE SESSION TO ${DB_USER};\nGRANT SELECT ON V_\$INSTANCE TO ${DB_USER};\nGRANT SELECT ON V_\$DATABASE TO ${DB_USER};\nGRANT SELECT ON V_\$CONTAINERS TO ${DB_USER};\nGRANT SELECT ON V_\$DATAFILE TO ${DB_USER};\nGRANT SELECT ON V_\$SYSSTAT TO ${DB_USER};\nGRANT SELECT ON V_\$SYSMETRIC TO ${DB_USER};\nGRANT SELECT ON V_\$SESSION TO ${DB_USER};\nGRANT SELECT ON V_\$RESOURCE_LIMIT TO ${DB_USER};\nGRANT SELECT ON V_\$OSSTAT TO ${DB_USER};\nGRANT SELECT ON V_\$SGAINFO TO ${DB_USER};\nGRANT SELECT ON V_\$ROWCACHE TO ${DB_USER};\nGRANT SELECT ON V_\$PARAMETER TO ${DB_USER};\nGRANT SELECT ON DBA_TABLESPACE_USAGE_METRICS TO ${DB_USER};\nGRANT SELECT ON DBA_TABLESPACES TO ${DB_USER};\nGRANT SELECT ON DBA_DATA_FILES TO ${DB_USER};\nGRANT SELECT ON DBA_FREE_SPACE TO ${DB_USER};\nGRANT SELECT ON DBA_RECYCLEBIN TO ${DB_USER};\nGRANT SELECT ON V_\$SQL TO ${DB_USER};\nGRANT SELECT ON V_\$SQL_PLAN TO ${DB_USER};\nGRANT SELECT ON V_\$LOCK TO ${DB_USER};\nGRANT SELECT ON V_\$SESSION_EVENT TO ${DB_USER};\nGRANT SELECT ON DBA_PROCEDURES TO ${DB_USER};\nGRANT SELECT ON DBA_OBJECTS TO ${DB_USER};\nGRANT SELECT ON V_\$PDBS TO ${DB_USER};\nEXIT;\n' | sudo su - oracle -c 'sqlplus -S / as sysdba'" 2>&1) fi - if [ $? -ne 0 ]; then + if [ $? -ne 0 ] || echo "$RESULT" | grep -qi "ORA-"; then echo "SQL script failed:" >&2 echo "$RESULT" >&2 + rm -f "$PW_FILE" "$USER_FILE" exit 1 fi echo "$RESULT" - echo "Oracle Database monitoring identity configured successfully." + echo "Oracle Database monitoring identity configured successfully: $DB_USER" create_collector_config: cmds: - | PRESET="{{.NR_CLI_ORACLE_CONFIG_PRESET}}" - CONTAINER_TYPE="{{.NR_CLI_ORACLE_CONTAINER_TYPE}}" HOST="{{.NR_CLI_ORACLE_HOST}}" PORT="{{.NR_CLI_ORACLE_PORT}}" SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" - LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" REGION="{{.NEW_RELIC_REGION}}" LICENSE_KEY="{{.NEW_RELIC_LICENSE_KEY}}" CONFIG_DIR="/etc/nrdot-collector" CONFIG_PATH="${CONFIG_DIR}/oracle-config.yaml" ENV_FILE="${CONFIG_DIR}/nrdot-collector.conf" PW_FILE="/tmp/nr-oracle-newrelic-pw.tmp" + USER_FILE="/tmp/nr-oracle-db-user.tmp" mkdir -p "$CONFIG_DIR" NR_PASSWORD=$(cat "$PW_FILE") - - if [ "$CONTAINER_TYPE" = "1" ]; then - DB_USERNAME="c##${LOGIN_NAME}" - else - DB_USERNAME="${LOGIN_NAME}" - fi + DB_USERNAME=$(cat "$USER_FILE") case "$REGION" in staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net" ;; @@ -958,13 +968,22 @@ install: EOF fi - cat > "$ENV_FILE" << EOF - OTELCOL_OPTIONS="--config=${CONFIG_PATH}" - EOF + EXISTING_OPTIONS=$(grep "^OTELCOL_OPTIONS=" "$ENV_FILE" 2>/dev/null | sed 's/^OTELCOL_OPTIONS=//' | tr -d '"') + if echo "$EXISTING_OPTIONS" | grep -q -- "--config=${CONFIG_PATH}"; then + OTELCOL_OPTIONS="$EXISTING_OPTIONS" + else + OTELCOL_OPTIONS="--config=${CONFIG_PATH}" + fi + + if grep -q "^OTELCOL_OPTIONS=" "$ENV_FILE" 2>/dev/null; then + sed -i "s|^OTELCOL_OPTIONS=.*|OTELCOL_OPTIONS=\"${OTELCOL_OPTIONS}\"|" "$ENV_FILE" + else + echo "OTELCOL_OPTIONS=\"${OTELCOL_OPTIONS}\"" | tee -a "$ENV_FILE" > /dev/null + fi - rm -f "$PW_FILE" + rm -f "$PW_FILE" "$USER_FILE" echo "Oracle OTel config written to ${CONFIG_PATH}" - echo "Env file written to ${ENV_FILE}" + echo "OTELCOL_OPTIONS updated in ${ENV_FILE}: ${OTELCOL_OPTIONS}" restart_nrdot: cmds: From 94d41824b4002f956defb02dcf389f234824ac54 Mon Sep 17 00:00:00 2001 From: rreddy Date: Thu, 6 Aug 2026 15:41:07 +0530 Subject: [PATCH 19/33] guarantee password complexity for auto-generated monitoring password --- .../infrastructure/nrdot/oracle-otel/rhel.yml | 8 ++++- .../rds-rhel/centos-9-oracle-otel-rds.json | 35 ------------------- .../oracle-otel/rhel/rhel-9-oracle-otel.json | 35 ------------------- 3 files changed, 7 insertions(+), 71 deletions(-) delete mode 100644 test/definitions/nrdot/oracle-otel/rds-rhel/centos-9-oracle-otel-rds.json delete mode 100644 test/definitions/nrdot/oracle-otel/rhel/rhel-9-oracle-otel.json diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index 36e1777da..84ca244e7 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -297,7 +297,13 @@ install: chmod 600 "$USER_FILE" if [ -z "{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" ]; then - NR_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24) + _FIRST=$(cat /dev/urandom | tr -dc 'A-Z' | head -c 1) + _UPPER=$(cat /dev/urandom | tr -dc 'A-Z' | head -c 2) + _LOWER=$(cat /dev/urandom | tr -dc 'a-z' | head -c 6) + _DIGITS=$(cat /dev/urandom | tr -dc '0-9' | head -c 4) + _REST=$(printf '%s' "${_UPPER}${_LOWER}${_DIGITS}#_" | fold -w1 | shuf | tr -d '\n') + NR_PASSWORD="${_FIRST}${_REST}" + unset _FIRST _UPPER _LOWER _DIGITS _REST else NR_PASSWORD="{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" fi diff --git a/test/definitions/nrdot/oracle-otel/rds-rhel/centos-9-oracle-otel-rds.json b/test/definitions/nrdot/oracle-otel/rds-rhel/centos-9-oracle-otel-rds.json deleted file mode 100644 index d807c57e8..000000000 --- a/test/definitions/nrdot/oracle-otel/rds-rhel/centos-9-oracle-otel-rds.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "global_tags": { - "owning_team": "database-integrations", - "Environment": "development", - "Department": "product", - "Product": "database-integrations" - }, - "resources": [ - { - "id": "host1", - "provider": "aws", - "type": "ec2", - "size": "t3.medium", - "ami_name": "CentOS Stream 9 x86_64*", - "user_name": "ec2-user" - } - ], - "instrumentations": { - "resources": [ - { - "id": "oracleotelrdscentos", - "resource_ids": ["host1"], - "source_repository": "https://github.com/newrelic/open-install-library.git", - "deploy_script_path": "test/deploy/linux/newrelic-cli/install-recipe/roles", - "params": { - "recipe_content_url": "https://raw.githubusercontent.com/newrelic/open-install-library/main/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml", - "recipe_targeted": "nrdot-collector-oracle-rds", - "validate_output": "NRDOT Oracle Database \\(AWS RDS, RHEL/CentOS/OEL collector host\\)\\s+\\(installed\\)", - "env_var": "NEW_RELIC_CLI_SKIP_CORE=1 NR_CLI_ORACLE_HOST=[credential:secrets:nrOracleRdsEndpoint] NR_CLI_ORACLE_PORT=1521 NR_CLI_ORACLE_ADMIN_USER=[credential:secrets:nrOracleRdsAdminUser] NR_CLI_ORACLE_ADMIN_PASSWORD=[credential:secrets:nrOracleRdsAdminPassword] NR_CLI_ORACLE_SERVICE_NAME=[credential:secrets:nrOracleRdsServiceName]" - }, - "provider": "newrelic" - } - ] - } -} diff --git a/test/definitions/nrdot/oracle-otel/rhel/rhel-9-oracle-otel.json b/test/definitions/nrdot/oracle-otel/rhel/rhel-9-oracle-otel.json deleted file mode 100644 index 5a00e3cd7..000000000 --- a/test/definitions/nrdot/oracle-otel/rhel/rhel-9-oracle-otel.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "global_tags": { - "owning_team": "database-integrations", - "Environment": "development", - "Department": "product", - "Product": "database-integrations" - }, - "resources": [ - { - "id": "host1", - "provider": "aws", - "type": "ec2", - "size": "t3.medium", - "ami_name": "RHEL-9.*_HVM-????????-x86_64-?-Hourly2-GP3", - "user_name": "ec2-user" - } - ], - "instrumentations": { - "resources": [ - { - "id": "oracleotelrhel", - "resource_ids": ["host1"], - "source_repository": "https://github.com/newrelic/open-install-library.git", - "deploy_script_path": "test/deploy/linux/newrelic-cli/install-recipe/roles", - "params": { - "recipe_content_url": "https://raw.githubusercontent.com/newrelic/open-install-library/main/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml", - "recipe_targeted": "nrdot-collector-oracle", - "validate_output": "NRDOT Oracle Database \\(RHEL/OEL\\)\\s+\\(installed\\)", - "env_var": "NEW_RELIC_CLI_SKIP_CORE=1 NR_CLI_ORACLE_CONFIG_PRESET=1 NR_CLI_ORACLE_CONTAINER_TYPE=1 NR_CLI_ORACLE_HOST=localhost NR_CLI_ORACLE_PORT=1521 NR_CLI_ORACLE_SYS_PASSWORD=[credential:secrets:nrOracleSysPassword] NR_CLI_ORACLE_SERVICE_NAME=[credential:secrets:nrOracleCdbServiceName]" - }, - "provider": "newrelic" - } - ] - } -} From 4e3b128caeb87d6c9f8d640d7872ce57cf052e16 Mon Sep 17 00:00:00 2001 From: rreddy Date: Thu, 6 Aug 2026 16:06:17 +0530 Subject: [PATCH 20/33] remove invalid nroracledb config keys, simplify restart check --- .../infrastructure/nrdot/oracle-otel/rhel.yml | 39 ++++++++----------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index 84ca244e7..398fc12e1 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -486,8 +486,6 @@ install: enabled: true attributes: - oracle.db.pdb - oracledb.system.cpu.load: - enabled: true oracledb.executions: enabled: true attributes: @@ -720,8 +718,6 @@ install: enabled: true oracle.db.open_mode: enabled: true - oracle.db.pdb: - enabled: true oracle.db.role: enabled: true oracle.db.version: @@ -994,25 +990,23 @@ install: restart_nrdot: cmds: - | - systemctl restart nrdot-collector + echo "" + echo "==> Restarting NRDOT Collector..." + sudo systemctl restart nrdot-collector - assert_nrdot_status_ok: - cmds: - - | - MAX_RETRIES=30 - TRIES=0 - echo "Waiting for NRDOT Collector to start..." - while [ $TRIES -lt $MAX_RETRIES ]; do - TRIES=$((TRIES + 1)) - if systemctl is-active --quiet nrdot-collector; then - echo "NRDOT Collector is running." - exit 0 - fi - sleep 2 - done - echo "NRDOT Collector did not start in time. Check logs:" >&2 - journalctl -u nrdot-collector --no-pager -n 50 >&2 - exit 31 + echo "" + echo "==> NRDOT Collector service status:" + echo "" + sudo systemctl status nrdot-collector --no-pager + + if sudo systemctl is-active --quiet nrdot-collector; then + echo "" + echo -e "\e[32mNRDOT Collector is running successfully.\e[0m" + else + echo "" + echo -e "\e[31mERROR:\e[0m NRDOT Collector failed to start. Check the status output above." >&2 + exit 131 + fi default: cmds: @@ -1024,7 +1018,6 @@ install: - task: configure_database_user - task: create_collector_config - task: restart_nrdot - - task: assert_nrdot_status_ok postInstall: info: |2 From 379de2252e151deb12593df781185808d07e0a38 Mon Sep 17 00:00:00 2001 From: rreddy Date: Thu, 6 Aug 2026 16:17:38 +0530 Subject: [PATCH 21/33] add missing gRPC port to OTLP_ENDPOINT --- .../newrelic/infrastructure/nrdot/oracle-otel/rhel.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index 398fc12e1..e70a266cc 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -349,10 +349,10 @@ install: DB_USERNAME=$(cat "$USER_FILE") case "$REGION" in - staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net" ;; - EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net" ;; - JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net" ;; - *) OTLP_ENDPOINT="https://otlp.nr-data.net" ;; + staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net:4317" ;; + EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net:4317" ;; + JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net:4317" ;; + *) OTLP_ENDPOINT="https://otlp.nr-data.net:4317" ;; esac if [ "$PRESET" = "2" ]; then From 8fce8b683b4da1fd71b838e190140bf7546ec08a Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 11 Aug 2026 14:35:14 +0530 Subject: [PATCH 22/33] add oracle rds debian recipe, disable metrics unsupported on RDS --- .../nrdot/oracle-otel/rds-debian.yml | 664 ++++++++++++++++++ .../nrdot/oracle-otel/rds-rhel.yml | 62 +- 2 files changed, 703 insertions(+), 23 deletions(-) create mode 100644 recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml new file mode 100644 index 000000000..a8008fdd2 --- /dev/null +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -0,0 +1,664 @@ +# Visit our schema definition for additional information on this file format. +# https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition + +name: nrdot-collector-oracle-rds +displayName: NRDOT Oracle Database (AWS RDS, Debian/Ubuntu collector host) +description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector against an AWS RDS Oracle instance, collector installed on Debian/Ubuntu +repository: https://github.com/newrelic/nrdot-collector-releases + +installTargets: + - type: host + os: linux + platformFamily: debian + - type: host + os: linux + platform: ubuntu + +keywords: + - Oracle + - Oracle Database + - RDS + - NRDOT + - OpenTelemetry + - OTel + - Database + - Linux + - Debian + - Ubuntu + +processMatch: [] + +preInstall: + discoveryMode: + - targeted + info: | + To capture data from your RDS Oracle Database, we need to create/authorize a + monitoring identity (a database user) using the RDS master user's credentials. + +inputVars: + - name: NR_CLI_ORACLE_HOST + prompt: "RDS Oracle endpoint: " + - name: NR_CLI_ORACLE_PORT + prompt: "Oracle listener port: " + default: "1521" + - name: NR_CLI_ORACLE_ADMIN_USER + prompt: "RDS master username (used once to create the monitoring user and grant privileges): " + - name: NR_CLI_ORACLE_ADMIN_PASSWORD + prompt: "RDS master password: " + secret: true + - name: NR_CLI_ORACLE_LOGIN_NAME + prompt: "Monitoring username: " + default: "newrelic" + - name: NR_CLI_ORACLE_LOGIN_PASSWORD + prompt: "Password for the monitoring login (leave blank to auto-generate a random password): " + secret: true + - name: NR_CLI_ORACLE_SERVICE_NAME + prompt: "RDS DB service name for the collector connection: " + +validationNrql: "SELECT count(*) FROM Metric WHERE metricName LIKE 'oracledb.%' AND instrumentation.provider = 'opentelemetry' SINCE 10 minutes ago" + +successLinkConfig: + type: EXPLORER + +install: + version: "3" + silent: true + + vars: + IS_SYSTEMCTL: + sh: command -v systemctl | wc -l + + tasks: + write_recipe_metadata: + cmds: + - | + echo '{"Metadata":{"CapturedCliOutput":"true"}}' | tee {{.NR_CLI_OUTPUT}} > /dev/null + + assert_pre_req: + cmds: + - | + if [ "$(id -u)" != "0" ]; then + echo "This newrelic install must be run under sudo or root" >&2 + exit 131 + fi + - | + if ! command -v curl > /dev/null 2>&1; then + echo "curl is required to run the newrelic install. Please install curl and re-run the installation." >&2 + exit 16 + fi + - | + if [ "{{.IS_SYSTEMCTL}}" -eq 0 ]; then + echo "systemd is required for the nrdot-collector service configuration." >&2 + exit 131 + fi + + assert_oracle_version: + cmds: + - | + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" + ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" + + VERSION_OUTPUT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << 'SQL' + WHENEVER SQLERROR EXIT SQL.SQLCODE + SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON + SELECT version FROM v$instance; + EXIT; + SQL + ) + if [ $? -ne 0 ]; then + echo "Failed to connect to the RDS Oracle Database to check its version:" >&2 + echo "$VERSION_OUTPUT" >&2 + exit 1 + fi + + MAJOR_VERSION=$(echo "$VERSION_OUTPUT" | grep -oE '^[0-9]+' | head -1) + + if [ -z "$MAJOR_VERSION" ] || [ "$MAJOR_VERSION" -lt 19 ]; then + echo "Oracle Database version ${MAJOR_VERSION:-unknown} is not supported. Oracle Database 19c or later is required." >&2 + exit 1 + fi + + echo "Oracle Database major version ${MAJOR_VERSION} detected - supported." + + install_nrdot: + cmds: + - | + COLLECTOR_DISTRO="nrdot-collector" + + if dpkg -l | grep -q "^ii.*${COLLECTOR_DISTRO} "; then + echo "NRDOT Collector is already installed." + echo "" + echo "Please follow the steps below to complete the setup:" + echo "" + echo " 1. Create oracle-config.yaml" + echo " if not present. Refer to:" + echo " https://docs.newrelic.com/docs/opentelemetry/database/otel-oracledb/" + echo "" + echo " 2. Make sure the monitoring user is created" + echo " and has the required permissions granted." + echo "" + echo " 3. After making the above changes, restart the NRDOT Collector:" + echo " sudo systemctl restart nrdot-collector" + echo "" + exit 131 + fi + + COLLECTOR_VERSION=$(curl -sf "https://api.github.com/repos/newrelic/nrdot-collector-releases/releases/latest" | grep '"tag_name":' | awk -F'"' '{print $4}') + if [ -z "$COLLECTOR_VERSION" ]; then + echo "Failed to fetch the latest release version from GitHub. Please check your internet connection." >&2 + exit 1 + fi + + if [ "$(uname -m)" = "aarch64" ]; then + ARCH="arm64" + else + ARCH="amd64" + fi + + DOWNLOAD_URL="https://github.com/newrelic/nrdot-collector-releases/releases/download/${COLLECTOR_VERSION}/${COLLECTOR_DISTRO}_${COLLECTOR_VERSION}_linux_${ARCH}.deb" + echo "Installing ${COLLECTOR_DISTRO} version: ${COLLECTOR_VERSION}" + echo "Downloading from: ${DOWNLOAD_URL}" + + curl -L --output /tmp/nrdot-collector.deb "$DOWNLOAD_URL" + if [ $? -ne 0 ]; then + echo "Failed to download the nrdot-collector package." >&2 + exit 1 + fi + + DEBIAN_FRONTEND=noninteractive dpkg -i /tmp/nrdot-collector.deb + if [ $? -ne 0 ]; then + echo "dpkg install failed, attempting to fix broken dependencies..." >&2 + apt-get -o DPkg::Lock::Timeout=60 install -f -y + if [ $? -ne 0 ]; then + echo "Failed to install the nrdot-collector package." >&2 + exit 1 + fi + fi + + rm -f /tmp/nrdot-collector.deb + echo "${COLLECTOR_DISTRO} installed successfully." + + configure_database_user: + cmds: + - | + LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" + LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" + ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" + PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" + + if [ -z "{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" ]; then + NR_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24) + else + NR_PASSWORD="{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" + fi + printf '%s' "$NR_PASSWORD" > "$PW_FILE" + chmod 600 "$PW_FILE" + + RESULT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << SQL 2>&1 + WHENEVER SQLERROR EXIT SQL.SQLCODE + CREATE USER ${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}"; + GRANT CONNECT TO ${LOGIN_NAME}; + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SYSMETRIC', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CON_SYSMETRIC', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CONTAINERS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SESSION', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SESSION_EVENT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SYSSTAT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$CON_SYSSTAT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$OSSTAT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SGAINFO', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQL', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQLSTATS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SQL_PLAN', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$PARAMETER', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$ROWCACHE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$RESOURCE_LIMIT', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$LOCK', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$DATABASE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$INSTANCE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$DATAFILE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$PDBS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_DATA_FILES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_FREE_SPACE', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_RECYCLEBIN', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_TABLESPACE_USAGE_METRICS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_PROCEDURES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBA_OBJECTS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_TABLESPACE_USAGE_METRICS', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_TABLESPACES', '${LOGIN_UPPER}', 'SELECT', false); + EXEC rdsadmin.rdsadmin_util.grant_sys_object('CDB_SERVICES', '${LOGIN_UPPER}', 'SELECT', false); + GRANT CREATE SESSION TO ${LOGIN_UPPER}; + EXIT; + SQL + ) + + if [ $? -ne 0 ]; then + echo "SQL script failed:" >&2 + echo "$RESULT" >&2 + exit 1 + fi + echo "$RESULT" + + echo "RDS Oracle Database monitoring identity configured successfully." + + create_collector_config: + cmds: + - | + HOST="{{.NR_CLI_ORACLE_HOST}}" + PORT="{{.NR_CLI_ORACLE_PORT}}" + SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" + LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" + REGION="{{.NEW_RELIC_REGION}}" + LICENSE_KEY="{{.NEW_RELIC_LICENSE_KEY}}" + CONFIG_DIR="/etc/nrdot-collector" + CONFIG_PATH="${CONFIG_DIR}/oracle-config.yaml" + ENV_FILE="${CONFIG_DIR}/nrdot-collector.conf" + PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" + + mkdir -p "$CONFIG_DIR" + + NR_PASSWORD=$(cat "$PW_FILE") + + case "$REGION" in + staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net" ;; + EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net" ;; + JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net" ;; + *) OTLP_ENDPOINT="https://otlp.nr-data.net" ;; + esac + + cat > "$CONFIG_PATH" << EOF + receivers: + nroracledb: + endpoint: "${HOST}:${PORT}" + username: "${LOGIN_NAME}" + password: "${NR_PASSWORD}" + service: "${SERVICE_NAME}" + collection_interval: 10s + events: + db.server.query_sample: + enabled: true + db.server.top_query: + enabled: true + db.server.session.wait_sample: + enabled: true + top_query_collection: + max_query_sample_count: 1000 + top_query_count: 200 + collection_interval: 60s + allowed_comment_keys: + - nr_service_guid + query_sample_collection: + max_rows_per_query: 100 + allowed_comment_keys: + - nr_service_guid + session_wait_event_collection: + max_rows_per_query: 100 + metrics: + EOF + + cat >> "$CONFIG_PATH" << 'EOF' + oracledb.cpu_time: + enabled: true + attributes: + - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.database.cpu.utilization: + enabled: false + attributes: + - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.host.cpu.utilization: + enabled: false + attributes: + - oracle.db.pdb + oracledb.system.cpu.load: + enabled: true + oracledb.executions: + enabled: true + attributes: + - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.execution.utilization: + enabled: false + attributes: + - oracledb.parse.type + - oracle.db.pdb + oracledb.parse_calls: + enabled: true + attributes: + - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.parse.rate: + enabled: false + attributes: + - oracledb.parse.result + - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.parse.utilization: + enabled: false + attributes: + - oracle.db.pdb + oracledb.hard_parses: + enabled: true + attributes: + - oracle.db.pdb + oracledb.logical_reads: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_reads: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_reads_direct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_writes: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_writes_direct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_read_io_requests: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_write_io_requests: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_io.cache_writes: + enabled: true + attributes: + - oracle.db.pdb + oracledb.physical_io.requests: + enabled: true + attributes: + - disk.io.direction + - disk.io.block_size + - oracle.db.pdb + oracledb.physical_io.transferred: + enabled: true + attributes: + - disk.io.direction + - disk.io.type + - oracle.db.pdb + oracledb.sqlnet.io.transferred: + enabled: true + attributes: + - network.io.direction + - destination.type + - oracle.db.pdb + oracledb.consistent_gets: + enabled: true + attributes: + - oracle.db.pdb + oracledb.db_block_gets: + enabled: true + attributes: + - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.buffer_cache.utilization: + enabled: false + attributes: + - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.library_cache.utilization: + enabled: false + attributes: + - oracle.db.pdb + oracledb.data_dictionary.hit_ratio: + enabled: true + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.shared_pool.utilization: + enabled: false + attributes: + - oracle.db.pdb + oracledb.pga_memory: + enabled: true + attributes: + - oracle.db.pdb + oracledb.sga.limit: + enabled: true + oracledb.sga.usage: + enabled: true + attributes: + - oracledb.sga.component.name + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.database.wait.utilization: + enabled: false + attributes: + - oracle.db.pdb + # DISABLED on RDS: v$resource_limit empty in PDB. + oracledb.dml_locks.limit: + enabled: false + oracledb.dml_locks.usage: + enabled: false + oracledb.enqueue_locks.limit: + enabled: false + oracledb.enqueue_locks.usage: + enabled: false + oracledb.enqueue_resources.limit: + enabled: false + oracledb.enqueue_resources.usage: + enabled: false + oracledb.enqueue_deadlocks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.exchange_deadlocks: + enabled: true + attributes: + - oracle.db.pdb + # DISABLED on RDS: v$resource_limit empty in PDB. + oracledb.processes.limit: + enabled: false + oracledb.processes.usage: + enabled: false + oracledb.sessions.limit: + enabled: false + # KEEP enabled: sessions.usage is sourced from v$session, not v$resource_limit. + oracledb.sessions.usage: + enabled: true + attributes: + - session_type + - session_status + - oracle.db.pdb + oracledb.logons: + enabled: true + attributes: + - oracle.db.pdb + # DISABLED on RDS: v$resource_limit empty in PDB. + oracledb.transactions.limit: + enabled: false + oracledb.transactions.usage: + enabled: false + oracledb.user_commits: + enabled: true + attributes: + - oracle.db.pdb + oracledb.user_rollbacks: + enabled: true + attributes: + - oracle.db.pdb + oracledb.tablespace_size.limit: + enabled: true + attributes: + - tablespace_name + - oracle.db.pdb + oracledb.tablespace_size.usage: + enabled: true + attributes: + - tablespace_name + - oracle.db.pdb + oracledb.storage.usage: + enabled: true + oracledb.storage.utilization: + enabled: true + oracledb.recycle_bin.limit: + enabled: true + oracledb.queries_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.ddl_statements_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.dml_statements_parallelized: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_not_downgraded: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_1_to_25_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_25_to_50_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_50_to_75_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_75_to_99_pct: + enabled: true + attributes: + - oracle.db.pdb + oracledb.parallel_operations_downgraded_to_serial: + enabled: true + attributes: + - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.redo_allocation.utilization: + enabled: false + attributes: + - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.sort.ratio: + enabled: false + attributes: + - oracledb.sort.type + - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. + oracledb.sql_service.response.duration: + enabled: false + attributes: + - oracle.db.pdb + resource_attributes: + host.name: + enabled: true + oracle.db.hosting_type: + enabled: true + oracle.db.open_mode: + enabled: true + oracle.db.pdb: + enabled: true + oracle.db.role: + enabled: true + oracle.db.version: + enabled: true + oracledb.instance.name: + enabled: true + service.instance.id: + enabled: true + EOF + + cat >> "$CONFIG_PATH" << EOF + + processors: + batch: + resource/add_event_name: + attributes: + - key: host.address + value: "${HOST}" + action: upsert + + exporters: + otlp/newrelic: + endpoint: ${OTLP_ENDPOINT} + headers: + api-key: ${LICENSE_KEY} + compression: gzip + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s + + service: + pipelines: + metrics/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp/newrelic] + logs/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp/newrelic] + EOF + + cat > "$ENV_FILE" << EOF + OTELCOL_OPTIONS="--config=${CONFIG_PATH}" + EOF + + rm -f "$PW_FILE" + echo "Oracle OTel config written to ${CONFIG_PATH}" + echo "Env file written to ${ENV_FILE}" + + restart_nrdot: + cmds: + - | + systemctl restart nrdot-collector + + assert_nrdot_status_ok: + cmds: + - | + MAX_RETRIES=30 + TRIES=0 + echo "Waiting for NRDOT Collector to start..." + while [ $TRIES -lt $MAX_RETRIES ]; do + TRIES=$((TRIES + 1)) + if systemctl is-active --quiet nrdot-collector; then + echo "NRDOT Collector is running." + exit 0 + fi + sleep 2 + done + echo "NRDOT Collector did not start in time. Check logs:" >&2 + journalctl -u nrdot-collector --no-pager -n 50 >&2 + exit 31 + + default: + cmds: + - task: write_recipe_metadata + - task: assert_pre_req + - task: assert_oracle_version + - task: install_nrdot + - task: configure_database_user + - task: create_collector_config + - task: restart_nrdot + - task: assert_nrdot_status_ok + +postInstall: + info: |2 + Oracle OTel config: /etc/nrdot-collector/oracle-config.yaml + Env file: /etc/nrdot-collector/nrdot-collector.conf + Service status: systemctl status nrdot-collector + View logs: journalctl -u nrdot-collector -f + Restart service: sudo systemctl restart nrdot-collector diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index d870936a2..abcf72011 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -309,12 +309,14 @@ install: enabled: true attributes: - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.database.cpu.utilization: - enabled: true + enabled: false attributes: - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.host.cpu.utilization: - enabled: true + enabled: false attributes: - oracle.db.pdb oracledb.system.cpu.load: @@ -323,8 +325,9 @@ install: enabled: true attributes: - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.execution.utilization: - enabled: true + enabled: false attributes: - oracledb.parse.type - oracle.db.pdb @@ -332,13 +335,15 @@ install: enabled: true attributes: - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.parse.rate: - enabled: true + enabled: false attributes: - oracledb.parse.result - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.parse.utilization: - enabled: true + enabled: false attributes: - oracle.db.pdb oracledb.hard_parses: @@ -403,18 +408,21 @@ install: enabled: true attributes: - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.buffer_cache.utilization: - enabled: true + enabled: false attributes: - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.library_cache.utilization: - enabled: true + enabled: false attributes: - oracle.db.pdb oracledb.data_dictionary.hit_ratio: enabled: true + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.shared_pool.utilization: - enabled: true + enabled: false attributes: - oracle.db.pdb oracledb.pga_memory: @@ -427,22 +435,24 @@ install: enabled: true attributes: - oracledb.sga.component.name + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.database.wait.utilization: - enabled: true + enabled: false attributes: - oracle.db.pdb + # DISABLED on RDS: v$resource_limit empty in PDB. oracledb.dml_locks.limit: - enabled: true + enabled: false oracledb.dml_locks.usage: - enabled: true + enabled: false oracledb.enqueue_locks.limit: - enabled: true + enabled: false oracledb.enqueue_locks.usage: - enabled: true + enabled: false oracledb.enqueue_resources.limit: - enabled: true + enabled: false oracledb.enqueue_resources.usage: - enabled: true + enabled: false oracledb.enqueue_deadlocks: enabled: true attributes: @@ -451,12 +461,14 @@ install: enabled: true attributes: - oracle.db.pdb + # DISABLED on RDS: v$resource_limit empty in PDB. oracledb.processes.limit: - enabled: true + enabled: false oracledb.processes.usage: - enabled: true + enabled: false oracledb.sessions.limit: - enabled: true + enabled: false + # KEEP enabled: sessions.usage is sourced from v$session, not v$resource_limit. oracledb.sessions.usage: enabled: true attributes: @@ -467,10 +479,11 @@ install: enabled: true attributes: - oracle.db.pdb + # DISABLED on RDS: v$resource_limit empty in PDB. oracledb.transactions.limit: - enabled: true + enabled: false oracledb.transactions.usage: - enabled: true + enabled: false oracledb.user_commits: enabled: true attributes: @@ -531,17 +544,20 @@ install: enabled: true attributes: - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.redo_allocation.utilization: - enabled: true + enabled: false attributes: - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.sort.ratio: - enabled: true + enabled: false attributes: - oracledb.sort.type - oracle.db.pdb + # DISABLED on RDS: v$sysmetric empty in PDB. oracledb.sql_service.response.duration: - enabled: true + enabled: false attributes: - oracle.db.pdb resource_attributes: From c22e2e058ff26add1c6ad4ad19663892366cdb6d Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 11 Aug 2026 15:17:47 +0530 Subject: [PATCH 23/33] remove invalid nroracledb config keys, simplify restart check for RDS recipes --- .../nrdot/oracle-otel/rds-debian.yml | 39 ++++++++----------- .../nrdot/oracle-otel/rds-rhel.yml | 39 ++++++++----------- 2 files changed, 32 insertions(+), 46 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index a8008fdd2..2d9302fa0 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -319,8 +319,6 @@ install: enabled: false attributes: - oracle.db.pdb - oracledb.system.cpu.load: - enabled: true oracledb.executions: enabled: true attributes: @@ -567,8 +565,6 @@ install: enabled: true oracle.db.open_mode: enabled: true - oracle.db.pdb: - enabled: true oracle.db.role: enabled: true oracle.db.version: @@ -624,25 +620,23 @@ install: restart_nrdot: cmds: - | - systemctl restart nrdot-collector + echo "" + echo "==> Restarting NRDOT Collector..." + sudo systemctl restart nrdot-collector - assert_nrdot_status_ok: - cmds: - - | - MAX_RETRIES=30 - TRIES=0 - echo "Waiting for NRDOT Collector to start..." - while [ $TRIES -lt $MAX_RETRIES ]; do - TRIES=$((TRIES + 1)) - if systemctl is-active --quiet nrdot-collector; then - echo "NRDOT Collector is running." - exit 0 - fi - sleep 2 - done - echo "NRDOT Collector did not start in time. Check logs:" >&2 - journalctl -u nrdot-collector --no-pager -n 50 >&2 - exit 31 + echo "" + echo "==> NRDOT Collector service status:" + echo "" + sudo systemctl status nrdot-collector --no-pager + + if sudo systemctl is-active --quiet nrdot-collector; then + echo "" + echo -e "\e[32mNRDOT Collector is running successfully.\e[0m" + else + echo "" + echo -e "\e[31mERROR:\e[0m NRDOT Collector failed to start. Check the status output above." >&2 + exit 131 + fi default: cmds: @@ -653,7 +647,6 @@ install: - task: configure_database_user - task: create_collector_config - task: restart_nrdot - - task: assert_nrdot_status_ok postInstall: info: |2 diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index abcf72011..50f6481c7 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -319,8 +319,6 @@ install: enabled: false attributes: - oracle.db.pdb - oracledb.system.cpu.load: - enabled: true oracledb.executions: enabled: true attributes: @@ -567,8 +565,6 @@ install: enabled: true oracle.db.open_mode: enabled: true - oracle.db.pdb: - enabled: true oracle.db.role: enabled: true oracle.db.version: @@ -624,25 +620,23 @@ install: restart_nrdot: cmds: - | - systemctl restart nrdot-collector + echo "" + echo "==> Restarting NRDOT Collector..." + sudo systemctl restart nrdot-collector - assert_nrdot_status_ok: - cmds: - - | - MAX_RETRIES=30 - TRIES=0 - echo "Waiting for NRDOT Collector to start..." - while [ $TRIES -lt $MAX_RETRIES ]; do - TRIES=$((TRIES + 1)) - if systemctl is-active --quiet nrdot-collector; then - echo "NRDOT Collector is running." - exit 0 - fi - sleep 2 - done - echo "NRDOT Collector did not start in time. Check logs:" >&2 - journalctl -u nrdot-collector --no-pager -n 50 >&2 - exit 31 + echo "" + echo "==> NRDOT Collector service status:" + echo "" + sudo systemctl status nrdot-collector --no-pager + + if sudo systemctl is-active --quiet nrdot-collector; then + echo "" + echo -e "\e[32mNRDOT Collector is running successfully.\e[0m" + else + echo "" + echo -e "\e[31mERROR:\e[0m NRDOT Collector failed to start. Check the status output above." >&2 + exit 131 + fi default: cmds: @@ -653,7 +647,6 @@ install: - task: configure_database_user - task: create_collector_config - task: restart_nrdot - - task: assert_nrdot_status_ok postInstall: info: |2 From b242e855ad9e5f80e88d5540317b763dac38a03f Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 11 Aug 2026 15:27:58 +0530 Subject: [PATCH 24/33] add port for endpoint --- .../infrastructure/nrdot/oracle-otel/rds-debian.yml | 8 ++++---- .../infrastructure/nrdot/oracle-otel/rds-rhel.yml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index 2d9302fa0..fd569e097 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -268,10 +268,10 @@ install: NR_PASSWORD=$(cat "$PW_FILE") case "$REGION" in - staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net" ;; - EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net" ;; - JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net" ;; - *) OTLP_ENDPOINT="https://otlp.nr-data.net" ;; + staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net:4317" ;; + EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net:4317" ;; + JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net:4317" ;; + *) OTLP_ENDPOINT="https://otlp.nr-data.net:4317" ;; esac cat > "$CONFIG_PATH" << EOF diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index 50f6481c7..6f3d8a86c 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -268,10 +268,10 @@ install: NR_PASSWORD=$(cat "$PW_FILE") case "$REGION" in - staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net" ;; - EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net" ;; - JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net" ;; - *) OTLP_ENDPOINT="https://otlp.nr-data.net" ;; + staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net:4317" ;; + EU) OTLP_ENDPOINT="https://otlp.eu01.nr-data.net:4317" ;; + JP) OTLP_ENDPOINT="https://otlp.jp.nr-data.net:4317" ;; + *) OTLP_ENDPOINT="https://otlp.nr-data.net:4317" ;; esac cat > "$CONFIG_PATH" << EOF From e8c6a3518cae5282dd7f0169d85cb1c5c12d3c80 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 11 Aug 2026 15:50:40 +0530 Subject: [PATCH 25/33] add existing monitoring user check/prompt to RDS recipes --- .../nrdot/oracle-otel/rds-debian.yml | 59 +++++++++++++++++-- .../nrdot/oracle-otel/rds-rhel.yml | 59 +++++++++++++++++-- 2 files changed, 110 insertions(+), 8 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index fd569e097..33a543a55 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -185,13 +185,62 @@ install: cmds: - | LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" - LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') HOST="{{.NR_CLI_ORACLE_HOST}}" PORT="{{.NR_CLI_ORACLE_PORT}}" SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" + USER_FILE="/tmp/nr-oracle-rds-db-user.tmp" + + LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') + + EXISTS_RESULT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << SQL 2>&1 + SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF + SELECT username FROM dba_users WHERE username='${LOGIN_UPPER}'; + EXIT; + SQL + ) || true + + if echo "$EXISTS_RESULT" | grep -qi "^[[:space:]]*${LOGIN_UPPER}[[:space:]]*$"; then + echo "" + echo "Monitoring user $LOGIN_NAME already exists." + echo "" + echo "What would you like to do?" + echo " 1. Use the existing user $LOGIN_NAME (you will be asked for the password)" + echo " 2. Create a new username" + echo "" + read -rp "Enter your choice (1 or 2): " USER_CHOICE + + case "$USER_CHOICE" in + 1) + echo "" + stty -echo + read -rp "Enter the existing password for $LOGIN_NAME: " NR_PASSWORD + stty echo + echo "" + printf '%s' "$NR_PASSWORD" > "$PW_FILE" + chmod 600 "$PW_FILE" + echo "$LOGIN_NAME" > "$USER_FILE" + chmod 600 "$USER_FILE" + echo "Using existing user: $LOGIN_NAME" + exit 0 + ;; + 2) + echo "" + read -rp "Enter new monitoring username: " NEW_USERNAME + LOGIN_NAME="$NEW_USERNAME" + LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') + ;; + *) + echo "Invalid choice. Please re-run and enter 1 or 2." >&2 + exit 131 + ;; + esac + fi + + echo "$LOGIN_NAME" > "$USER_FILE" + chmod 600 "$USER_FILE" if [ -z "{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" ]; then NR_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24) @@ -243,11 +292,12 @@ install: if [ $? -ne 0 ]; then echo "SQL script failed:" >&2 echo "$RESULT" >&2 + rm -f "$PW_FILE" "$USER_FILE" exit 1 fi echo "$RESULT" - echo "RDS Oracle Database monitoring identity configured successfully." + echo "RDS Oracle Database monitoring identity configured successfully: $LOGIN_NAME" create_collector_config: cmds: @@ -255,17 +305,18 @@ install: HOST="{{.NR_CLI_ORACLE_HOST}}" PORT="{{.NR_CLI_ORACLE_PORT}}" SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" - LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" REGION="{{.NEW_RELIC_REGION}}" LICENSE_KEY="{{.NEW_RELIC_LICENSE_KEY}}" CONFIG_DIR="/etc/nrdot-collector" CONFIG_PATH="${CONFIG_DIR}/oracle-config.yaml" ENV_FILE="${CONFIG_DIR}/nrdot-collector.conf" PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" + USER_FILE="/tmp/nr-oracle-rds-db-user.tmp" mkdir -p "$CONFIG_DIR" NR_PASSWORD=$(cat "$PW_FILE") + LOGIN_NAME=$(cat "$USER_FILE") case "$REGION" in staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net:4317" ;; @@ -613,7 +664,7 @@ install: OTELCOL_OPTIONS="--config=${CONFIG_PATH}" EOF - rm -f "$PW_FILE" + rm -f "$PW_FILE" "$USER_FILE" echo "Oracle OTel config written to ${CONFIG_PATH}" echo "Env file written to ${ENV_FILE}" diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index 6f3d8a86c..222f1fd5c 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -185,13 +185,62 @@ install: cmds: - | LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" - LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') HOST="{{.NR_CLI_ORACLE_HOST}}" PORT="{{.NR_CLI_ORACLE_PORT}}" SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" + USER_FILE="/tmp/nr-oracle-rds-db-user.tmp" + + LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') + + EXISTS_RESULT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << SQL 2>&1 + SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF + SELECT username FROM dba_users WHERE username='${LOGIN_UPPER}'; + EXIT; + SQL + ) || true + + if echo "$EXISTS_RESULT" | grep -qi "^[[:space:]]*${LOGIN_UPPER}[[:space:]]*$"; then + echo "" + echo "Monitoring user $LOGIN_NAME already exists." + echo "" + echo "What would you like to do?" + echo " 1. Use the existing user $LOGIN_NAME (you will be asked for the password)" + echo " 2. Create a new username" + echo "" + read -rp "Enter your choice (1 or 2): " USER_CHOICE + + case "$USER_CHOICE" in + 1) + echo "" + stty -echo + read -rp "Enter the existing password for $LOGIN_NAME: " NR_PASSWORD + stty echo + echo "" + printf '%s' "$NR_PASSWORD" > "$PW_FILE" + chmod 600 "$PW_FILE" + echo "$LOGIN_NAME" > "$USER_FILE" + chmod 600 "$USER_FILE" + echo "Using existing user: $LOGIN_NAME" + exit 0 + ;; + 2) + echo "" + read -rp "Enter new monitoring username: " NEW_USERNAME + LOGIN_NAME="$NEW_USERNAME" + LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') + ;; + *) + echo "Invalid choice. Please re-run and enter 1 or 2." >&2 + exit 131 + ;; + esac + fi + + echo "$LOGIN_NAME" > "$USER_FILE" + chmod 600 "$USER_FILE" if [ -z "{{.NR_CLI_ORACLE_LOGIN_PASSWORD}}" ]; then NR_PASSWORD=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 24) @@ -243,11 +292,12 @@ install: if [ $? -ne 0 ]; then echo "SQL script failed:" >&2 echo "$RESULT" >&2 + rm -f "$PW_FILE" "$USER_FILE" exit 1 fi echo "$RESULT" - echo "RDS Oracle Database monitoring identity configured successfully." + echo "RDS Oracle Database monitoring identity configured successfully: $LOGIN_NAME" create_collector_config: cmds: @@ -255,17 +305,18 @@ install: HOST="{{.NR_CLI_ORACLE_HOST}}" PORT="{{.NR_CLI_ORACLE_PORT}}" SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" - LOGIN_NAME="{{.NR_CLI_ORACLE_LOGIN_NAME}}" REGION="{{.NEW_RELIC_REGION}}" LICENSE_KEY="{{.NEW_RELIC_LICENSE_KEY}}" CONFIG_DIR="/etc/nrdot-collector" CONFIG_PATH="${CONFIG_DIR}/oracle-config.yaml" ENV_FILE="${CONFIG_DIR}/nrdot-collector.conf" PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" + USER_FILE="/tmp/nr-oracle-rds-db-user.tmp" mkdir -p "$CONFIG_DIR" NR_PASSWORD=$(cat "$PW_FILE") + LOGIN_NAME=$(cat "$USER_FILE") case "$REGION" in staging) OTLP_ENDPOINT="https://staging-otlp.nr-data.net:4317" ;; @@ -613,7 +664,7 @@ install: OTELCOL_OPTIONS="--config=${CONFIG_PATH}" EOF - rm -f "$PW_FILE" + rm -f "$PW_FILE" "$USER_FILE" echo "Oracle OTel config written to ${CONFIG_PATH}" echo "Env file written to ${ENV_FILE}" From af3e6985026c4d4576f53616386de36001365597 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 11 Aug 2026 20:11:05 +0530 Subject: [PATCH 26/33] add Host + Database config preset to RDS recipes --- .../nrdot/oracle-otel/rds-debian.yml | 299 +++++++++++++++++- .../nrdot/oracle-otel/rds-rhel.yml | 299 +++++++++++++++++- 2 files changed, 594 insertions(+), 4 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index 33a543a55..172d66c5d 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -36,6 +36,9 @@ preInstall: monitoring identity (a database user) using the RDS master user's credentials. inputVars: + - name: NR_CLI_ORACLE_CONFIG_PRESET + prompt: "NRDOT configuration - 1) Database only 2) Host + Database: " + default: "1" - name: NR_CLI_ORACLE_HOST prompt: "RDS Oracle endpoint: " - name: NR_CLI_ORACLE_PORT @@ -302,6 +305,7 @@ install: create_collector_config: cmds: - | + PRESET="{{.NR_CLI_ORACLE_CONFIG_PRESET}}" HOST="{{.NR_CLI_ORACLE_HOST}}" PORT="{{.NR_CLI_ORACLE_PORT}}" SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" @@ -325,7 +329,89 @@ install: *) OTLP_ENDPOINT="https://otlp.nr-data.net:4317" ;; esac - cat > "$CONFIG_PATH" << EOF + if [ "$PRESET" = "2" ]; then + cat > "$CONFIG_PATH" << EOF + extensions: + health_check: + + receivers: + otlp: + protocols: + grpc: + http: + + hostmetrics: + collection_interval: 60s + scrapers: + cpu: + metrics: + system.cpu.time: + enabled: false + system.cpu.utilization: + enabled: true + load: + memory: + metrics: + system.memory.utilization: + enabled: true + paging: + metrics: + system.paging.utilization: + enabled: false + system.paging.faults: + enabled: false + filesystem: + metrics: + system.filesystem.utilization: + enabled: true + disk: + metrics: + system.disk.merged: + enabled: false + system.disk.pending_operations: + enabled: false + system.disk.weighted_io_time: + enabled: false + network: + metrics: + system.network.connections: + enabled: false + + filelog: + include: + - /var/log/syslog + - /var/log/auth.log + - /var/log/dpkg.log + + nroracledb: + endpoint: "${HOST}:${PORT}" + username: "${LOGIN_NAME}" + password: "${NR_PASSWORD}" + service: "${SERVICE_NAME}" + collection_interval: 10s + events: + db.server.query_sample: + enabled: true + db.server.top_query: + enabled: true + db.server.session.wait_sample: + enabled: true + top_query_collection: + max_query_sample_count: 1000 + top_query_count: 200 + collection_interval: 60s + allowed_comment_keys: + - nr_service_guid + query_sample_collection: + max_rows_per_query: 100 + allowed_comment_keys: + - nr_service_guid + session_wait_event_collection: + max_rows_per_query: 100 + metrics: + EOF + else + cat > "$CONFIG_PATH" << EOF receivers: nroracledb: endpoint: "${HOST}:${PORT}" @@ -354,6 +440,7 @@ install: max_rows_per_query: 100 metrics: EOF + fi cat >> "$CONFIG_PATH" << 'EOF' oracledb.cpu_time: @@ -626,7 +713,214 @@ install: enabled: true EOF - cat >> "$CONFIG_PATH" << EOF + if [ "$PRESET" = "2" ]; then + cat >> "$CONFIG_PATH" << 'EOF' + + processors: + metricstransform: + transforms: + - include: system.cpu.utilization + action: update + operations: + - action: aggregate_labels + label_set: [state] + aggregation_type: mean + - include: system.paging.operations + action: update + operations: + - action: aggregate_labels + label_set: [direction] + aggregation_type: sum + + filter/exclude_cpu_utilization: + metrics: + datapoint: + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "interrupt"' + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "nice"' + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "softirq"' + + filter/exclude_memory_utilization: + metrics: + datapoint: + - 'metric.name == "system.memory.utilization" and attributes["state"] == "slab_unreclaimable"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "inactive"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "cached"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "buffered"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "slab_reclaimable"' + + filter/exclude_memory_usage: + metrics: + datapoint: + - 'metric.name == "system.memory.usage" and attributes["state"] == "slab_unreclaimable"' + - 'metric.name == "system.memory.usage" and attributes["state"] == "inactive"' + + filter/exclude_filesystem_utilization: + metrics: + datapoint: + - 'metric.name == "system.filesystem.utilization" and attributes["type"] == "squashfs"' + + filter/exclude_filesystem_usage: + metrics: + datapoint: + - 'metric.name == "system.filesystem.usage" and attributes["type"] == "squashfs"' + - 'metric.name == "system.filesystem.usage" and attributes["state"] == "reserved"' + + filter/exclude_filesystem_inodes_usage: + metrics: + datapoint: + - 'metric.name == "system.filesystem.inodes.usage" and attributes["type"] == "squashfs"' + - 'metric.name == "system.filesystem.inodes.usage" and attributes["state"] == "reserved"' + + filter/exclude_system_disk: + metrics: + datapoint: + - 'metric.name == "system.disk.operations" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.merged" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.io" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.io_time" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.operation_time" and IsMatch(attributes["device"], "^loop.*") == true' + + filter/exclude_system_paging: + metrics: + datapoint: + - 'metric.name == "system.paging.usage" and attributes["state"] == "cached"' + - 'metric.name == "system.paging.operations" and attributes["type"] == "cached"' + + filter/exclude_network: + metrics: + datapoint: + - 'IsMatch(metric.name, "^system.network.*") == true and attributes["device"] == "lo"' + + attributes/exclude_system_paging: + include: + match_type: strict + metric_names: + - system.paging.operations + actions: + - key: type + action: delete + + transform/clear_metadata: + metric_statements: + - context: metric + statements: + - set(metric.description, "") + - set(metric.unit, "") + + transform/host: + metric_statements: + - context: metric + statements: + - set(metric.description, "") + - set(metric.unit, "") + + transform: + trace_statements: + - context: span + statements: + - truncate_all(span.attributes, 4095) + - truncate_all(resource.attributes, 4095) + log_statements: + - context: log + statements: + - truncate_all(log.attributes, 4095) + - truncate_all(resource.attributes, 4095) + EOF + + cat >> "$CONFIG_PATH" << EOF + + memory_limiter: + check_interval: 1s + limit_mib: \${env:NEW_RELIC_MEMORY_LIMIT_MIB:-100} + + batch: + + resource/add_event_name: + attributes: + - key: host.address + value: "${HOST}" + action: upsert + + resourcedetection: + detectors: ["system"] + system: + hostname_sources: ["os"] + resource_attributes: + host.id: + enabled: true + + resourcedetection/db_safe: + detectors: ["system"] + override: false + system: + hostname_sources: ["os"] + resource_attributes: + host.id: + enabled: true + + resourcedetection/cloud: + detectors: ["gcp", "ec2", "azure"] + timeout: 2s + override: true + + resourcedetection/env: + detectors: ["env"] + timeout: 2s + override: true + + exporters: + otlp: + endpoint: ${OTLP_ENDPOINT} + headers: + api-key: ${LICENSE_KEY} + compression: gzip + + service: + pipelines: + metrics/host: + receivers: [hostmetrics] + processors: + - memory_limiter + - metricstransform + - filter/exclude_cpu_utilization + - filter/exclude_memory_utilization + - filter/exclude_memory_usage + - filter/exclude_filesystem_utilization + - filter/exclude_filesystem_usage + - filter/exclude_filesystem_inodes_usage + - filter/exclude_system_disk + - filter/exclude_network + - attributes/exclude_system_paging + - transform/host + - resourcedetection + - resourcedetection/cloud + - resourcedetection/env + - batch + exporters: [otlp] + traces: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + metrics: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + metrics/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp] + logs/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp] + extensions: [health_check] + EOF + else + cat >> "$CONFIG_PATH" << EOF processors: batch: @@ -659,6 +953,7 @@ install: processors: [resource/add_event_name, batch] exporters: [otlp/newrelic] EOF + fi cat > "$ENV_FILE" << EOF OTELCOL_OPTIONS="--config=${CONFIG_PATH}" diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index 222f1fd5c..3c880d9cc 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -40,6 +40,9 @@ preInstall: monitoring identity (a database user) using the RDS master user's credentials. inputVars: + - name: NR_CLI_ORACLE_CONFIG_PRESET + prompt: "NRDOT configuration - 1) Database only 2) Host + Database: " + default: "1" - name: NR_CLI_ORACLE_HOST prompt: "RDS Oracle endpoint: " - name: NR_CLI_ORACLE_PORT @@ -302,6 +305,7 @@ install: create_collector_config: cmds: - | + PRESET="{{.NR_CLI_ORACLE_CONFIG_PRESET}}" HOST="{{.NR_CLI_ORACLE_HOST}}" PORT="{{.NR_CLI_ORACLE_PORT}}" SERVICE_NAME="{{.NR_CLI_ORACLE_SERVICE_NAME}}" @@ -325,7 +329,89 @@ install: *) OTLP_ENDPOINT="https://otlp.nr-data.net:4317" ;; esac - cat > "$CONFIG_PATH" << EOF + if [ "$PRESET" = "2" ]; then + cat > "$CONFIG_PATH" << EOF + extensions: + health_check: + + receivers: + otlp: + protocols: + grpc: + http: + + hostmetrics: + collection_interval: 60s + scrapers: + cpu: + metrics: + system.cpu.time: + enabled: false + system.cpu.utilization: + enabled: true + load: + memory: + metrics: + system.memory.utilization: + enabled: true + paging: + metrics: + system.paging.utilization: + enabled: false + system.paging.faults: + enabled: false + filesystem: + metrics: + system.filesystem.utilization: + enabled: true + disk: + metrics: + system.disk.merged: + enabled: false + system.disk.pending_operations: + enabled: false + system.disk.weighted_io_time: + enabled: false + network: + metrics: + system.network.connections: + enabled: false + + filelog: + include: + - /var/log/messages + - /var/log/secure + - /var/log/yum.log + + nroracledb: + endpoint: "${HOST}:${PORT}" + username: "${LOGIN_NAME}" + password: "${NR_PASSWORD}" + service: "${SERVICE_NAME}" + collection_interval: 10s + events: + db.server.query_sample: + enabled: true + db.server.top_query: + enabled: true + db.server.session.wait_sample: + enabled: true + top_query_collection: + max_query_sample_count: 1000 + top_query_count: 200 + collection_interval: 60s + allowed_comment_keys: + - nr_service_guid + query_sample_collection: + max_rows_per_query: 100 + allowed_comment_keys: + - nr_service_guid + session_wait_event_collection: + max_rows_per_query: 100 + metrics: + EOF + else + cat > "$CONFIG_PATH" << EOF receivers: nroracledb: endpoint: "${HOST}:${PORT}" @@ -354,6 +440,7 @@ install: max_rows_per_query: 100 metrics: EOF + fi cat >> "$CONFIG_PATH" << 'EOF' oracledb.cpu_time: @@ -626,7 +713,214 @@ install: enabled: true EOF - cat >> "$CONFIG_PATH" << EOF + if [ "$PRESET" = "2" ]; then + cat >> "$CONFIG_PATH" << 'EOF' + + processors: + metricstransform: + transforms: + - include: system.cpu.utilization + action: update + operations: + - action: aggregate_labels + label_set: [state] + aggregation_type: mean + - include: system.paging.operations + action: update + operations: + - action: aggregate_labels + label_set: [direction] + aggregation_type: sum + + filter/exclude_cpu_utilization: + metrics: + datapoint: + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "interrupt"' + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "nice"' + - 'metric.name == "system.cpu.utilization" and attributes["state"] == "softirq"' + + filter/exclude_memory_utilization: + metrics: + datapoint: + - 'metric.name == "system.memory.utilization" and attributes["state"] == "slab_unreclaimable"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "inactive"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "cached"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "buffered"' + - 'metric.name == "system.memory.utilization" and attributes["state"] == "slab_reclaimable"' + + filter/exclude_memory_usage: + metrics: + datapoint: + - 'metric.name == "system.memory.usage" and attributes["state"] == "slab_unreclaimable"' + - 'metric.name == "system.memory.usage" and attributes["state"] == "inactive"' + + filter/exclude_filesystem_utilization: + metrics: + datapoint: + - 'metric.name == "system.filesystem.utilization" and attributes["type"] == "squashfs"' + + filter/exclude_filesystem_usage: + metrics: + datapoint: + - 'metric.name == "system.filesystem.usage" and attributes["type"] == "squashfs"' + - 'metric.name == "system.filesystem.usage" and attributes["state"] == "reserved"' + + filter/exclude_filesystem_inodes_usage: + metrics: + datapoint: + - 'metric.name == "system.filesystem.inodes.usage" and attributes["type"] == "squashfs"' + - 'metric.name == "system.filesystem.inodes.usage" and attributes["state"] == "reserved"' + + filter/exclude_system_disk: + metrics: + datapoint: + - 'metric.name == "system.disk.operations" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.merged" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.io" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.io_time" and IsMatch(attributes["device"], "^loop.*") == true' + - 'metric.name == "system.disk.operation_time" and IsMatch(attributes["device"], "^loop.*") == true' + + filter/exclude_system_paging: + metrics: + datapoint: + - 'metric.name == "system.paging.usage" and attributes["state"] == "cached"' + - 'metric.name == "system.paging.operations" and attributes["type"] == "cached"' + + filter/exclude_network: + metrics: + datapoint: + - 'IsMatch(metric.name, "^system.network.*") == true and attributes["device"] == "lo"' + + attributes/exclude_system_paging: + include: + match_type: strict + metric_names: + - system.paging.operations + actions: + - key: type + action: delete + + transform/clear_metadata: + metric_statements: + - context: metric + statements: + - set(metric.description, "") + - set(metric.unit, "") + + transform/host: + metric_statements: + - context: metric + statements: + - set(metric.description, "") + - set(metric.unit, "") + + transform: + trace_statements: + - context: span + statements: + - truncate_all(span.attributes, 4095) + - truncate_all(resource.attributes, 4095) + log_statements: + - context: log + statements: + - truncate_all(log.attributes, 4095) + - truncate_all(resource.attributes, 4095) + EOF + + cat >> "$CONFIG_PATH" << EOF + + memory_limiter: + check_interval: 1s + limit_mib: \${env:NEW_RELIC_MEMORY_LIMIT_MIB:-100} + + batch: + + resource/add_event_name: + attributes: + - key: host.address + value: "${HOST}" + action: upsert + + resourcedetection: + detectors: ["system"] + system: + hostname_sources: ["os"] + resource_attributes: + host.id: + enabled: true + + resourcedetection/db_safe: + detectors: ["system"] + override: false + system: + hostname_sources: ["os"] + resource_attributes: + host.id: + enabled: true + + resourcedetection/cloud: + detectors: ["gcp", "ec2", "azure"] + timeout: 2s + override: true + + resourcedetection/env: + detectors: ["env"] + timeout: 2s + override: true + + exporters: + otlp: + endpoint: ${OTLP_ENDPOINT} + headers: + api-key: ${LICENSE_KEY} + compression: gzip + + service: + pipelines: + metrics/host: + receivers: [hostmetrics] + processors: + - memory_limiter + - metricstransform + - filter/exclude_cpu_utilization + - filter/exclude_memory_utilization + - filter/exclude_memory_usage + - filter/exclude_filesystem_utilization + - filter/exclude_filesystem_usage + - filter/exclude_filesystem_inodes_usage + - filter/exclude_system_disk + - filter/exclude_network + - attributes/exclude_system_paging + - transform/host + - resourcedetection + - resourcedetection/cloud + - resourcedetection/env + - batch + exporters: [otlp] + traces: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + metrics: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + logs: + receivers: [otlp] + processors: [memory_limiter, transform, resourcedetection, resourcedetection/cloud, resourcedetection/env, batch] + exporters: [otlp] + metrics/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp] + logs/oracledb: + receivers: [nroracledb] + processors: [resource/add_event_name, batch] + exporters: [otlp] + extensions: [health_check] + EOF + else + cat >> "$CONFIG_PATH" << EOF processors: batch: @@ -659,6 +953,7 @@ install: processors: [resource/add_event_name, batch] exporters: [otlp/newrelic] EOF + fi cat > "$ENV_FILE" << EOF OTELCOL_OPTIONS="--config=${CONFIG_PATH}" From 6a175a3de0c05723c8a2ef3df3488f9afc26aae6 Mon Sep 17 00:00:00 2001 From: RamanaReddy8801 <106150577+RamanaReddy8801@users.noreply.github.com> Date: Tue, 18 Aug 2026 12:42:58 +0530 Subject: [PATCH 27/33] Update and rename rhel.yml to oci-liunx.yml --- .../nrdot/oracle-otel/{rhel.yml => oci-liunx.yml} | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) rename recipes/newrelic/infrastructure/nrdot/oracle-otel/{rhel.yml => oci-liunx.yml} (99%) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-liunx.yml similarity index 99% rename from recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml rename to recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-liunx.yml index e70a266cc..9d7f39a9e 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-liunx.yml @@ -1,17 +1,12 @@ # Visit our schema definition for additional information on this file format. # https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition -name: nrdot-collector-oracle +name: nrdot-collector-oracle-linux displayName: NRDOT Oracle Database (RHEL/OEL) description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector on RHEL/OEL self-hosted environments repository: https://github.com/newrelic/nrdot-collector-releases installTargets: - - type: host - os: linux - platform: "redhat" - platformFamily: rhel - platformVersion: "((7|8|9)\\.?.*)" - type: host os: linux platform: "oracle" From bdaf1422a6cbbeb996adb18168ded11da3c27bc1 Mon Sep 17 00:00:00 2001 From: rreddy Date: Fri, 21 Aug 2026 14:01:22 +0530 Subject: [PATCH 28/33] mark oracle-otel nrdot recipes as WIP - not for use --- recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml | 1 + recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml | 1 + recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index 172d66c5d..517d20ee6 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -1,5 +1,6 @@ # Visit our schema definition for additional information on this file format. # https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition +# WORK IN PROGRESS - not for use. name: nrdot-collector-oracle-rds displayName: NRDOT Oracle Database (AWS RDS, Debian/Ubuntu collector host) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index 3c880d9cc..a4e9b6387 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -1,5 +1,6 @@ # Visit our schema definition for additional information on this file format. # https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition +# WORK IN PROGRESS - not for use. name: nrdot-collector-oracle-rds displayName: NRDOT Oracle Database (AWS RDS, RHEL/CentOS/OEL collector host) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml index e70a266cc..08dbe9f43 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rhel.yml @@ -1,5 +1,6 @@ # Visit our schema definition for additional information on this file format. # https://github.com/newrelic/open-install-library/blob/main/docs/recipe-spec/recipe-spec.md#schema-definition +# WORK IN PROGRESS - not for use. name: nrdot-collector-oracle displayName: NRDOT Oracle Database (RHEL/OEL) From d30bd2cc2b4d9ddd6574f742dd1b96ed18c7f798 Mon Sep 17 00:00:00 2001 From: rreddy Date: Mon, 24 Aug 2026 17:47:58 +0530 Subject: [PATCH 29/33] fix security and reliability issues in oracle rds/oci nrdot recipes --- .../nrdot/oracle-otel/oci-liunx.yml | 125 ++++++++++++++++-- .../nrdot/oracle-otel/rds-debian.yml | 44 ++++-- .../nrdot/oracle-otel/rds-rhel.yml | 44 ++++-- 3 files changed, 181 insertions(+), 32 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-liunx.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-liunx.yml index a32e65793..90fc8414f 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-liunx.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-liunx.yml @@ -10,9 +10,13 @@ repository: https://github.com/newrelic/nrdot-collector-releases installTargets: - type: host os: linux - platform: "oracle" - platformFamily: rhel - platformVersion: "((7|8|9)\\.?.*)" + platform: centos + - type: host + os: linux + platform: redhat + - type: host + os: linux + platform: oracle keywords: - Oracle @@ -224,6 +228,8 @@ install: SSH_USER="{{.NR_CLI_ORACLE_SSH_USER}}" PW_FILE="/tmp/nr-oracle-newrelic-pw.tmp" USER_FILE="/tmp/nr-oracle-db-user.tmp" + NR_SUCCESS="" + trap 'if [ "$NR_SUCCESS" != "1" ]; then rm -f "$PW_FILE" "$USER_FILE"; fi' EXIT if [ -z "${SSH_AUTH_SOCK:-}" ]; then SSH_AUTH_SOCK=$(ls /tmp/ssh-*/agent.* 2>/dev/null | head -1) @@ -235,6 +241,12 @@ install: exit 131 fi + if ! printf '%s' "$LOGIN_NAME" | grep -qE '^[A-Za-z][A-Za-z0-9_]*$'; then + echo "Invalid monitoring username: $LOGIN_NAME" >&2 + echo "Usernames must start with a letter and contain only letters, digits, and underscores." >&2 + exit 131 + fi + if [ "$CONTAINER_TYPE" = "1" ]; then DB_USER="c##${LOGIN_NAME}" SET_CONTAINER="ALTER SESSION SET CONTAINER = CDB\$ROOT;" @@ -244,8 +256,16 @@ install: fi DB_USER_UPPER=$(echo "$DB_USER" | tr '[:lower:]' '[:upper:]') + + EXISTS_SQL=$(cat << SQLEOF + SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF + ${SET_CONTAINER} + SELECT username FROM dba_users WHERE username='${DB_USER_UPPER}'; + EXIT; + SQLEOF + ) EXISTS_RESULT=$(ssh -o StrictHostKeyChecking=no -o BatchMode=yes "${SSH_USER}@${HOST}" \ - "printf 'SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF\n${SET_CONTAINER}\nSELECT username FROM dba_users WHERE username='\"'\"'${DB_USER_UPPER}'\"'\"';\nEXIT;\n' | sudo su - oracle -c 'sqlplus -S / as sysdba'") || true + "sudo su - oracle -c 'sqlplus -S / as sysdba'" <<< "$EXISTS_SQL") || true if echo "$EXISTS_RESULT" | grep -qi "^[[:space:]]*${DB_USER_UPPER}[[:space:]]*$"; then echo "" @@ -269,6 +289,7 @@ install: echo "$DB_USER" > "$USER_FILE" chmod 600 "$USER_FILE" echo "Using existing user: $DB_USER" + NR_SUCCESS=1 exit 0 ;; 2) @@ -276,6 +297,11 @@ install: echo " Note: Just type the name without the c## prefix in CDB mode; it will be added automatically." read -rp "Enter new monitoring username: " NEW_USERNAME LOGIN_NAME="$NEW_USERNAME" + if ! printf '%s' "$LOGIN_NAME" | grep -qE '^[A-Za-z][A-Za-z0-9_]*$'; then + echo "Invalid monitoring username: $LOGIN_NAME" >&2 + echo "Usernames must start with a letter and contain only letters, digits, and underscores." >&2 + exit 131 + fi if [ "$CONTAINER_TYPE" = "1" ]; then DB_USER="c##${LOGIN_NAME}" else @@ -307,21 +333,96 @@ install: chmod 600 "$PW_FILE" if [ "$CONTAINER_TYPE" = "1" ]; then - RESULT=$(ssh -o StrictHostKeyChecking=no -o BatchMode=yes "${SSH_USER}@${HOST}" \ - "printf 'WHENEVER SQLERROR EXIT SQL.SQLCODE\nALTER SESSION SET CONTAINER = CDB\$ROOT;\nCREATE USER ${DB_USER} IDENTIFIED BY \"${NR_PASSWORD}\" CONTAINER=ALL;\nGRANT CREATE SESSION TO ${DB_USER} CONTAINER=ALL;\nALTER USER ${DB_USER} SET CONTAINER_DATA=ALL CONTAINER=CURRENT;\nGRANT SELECT ON V_\$INSTANCE TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$DATABASE TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$CONTAINERS TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$DATAFILE TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SYSSTAT TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$CON_SYSSTAT TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SYSMETRIC TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$CON_SYSMETRIC TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SESSION TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$RESOURCE_LIMIT TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$OSSTAT TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SGAINFO TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$ROWCACHE TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$PARAMETER TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON CDB_TABLESPACE_USAGE_METRICS TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON CDB_TABLESPACES TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON DBA_DATA_FILES TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON DBA_FREE_SPACE TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON DBA_RECYCLEBIN TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SQL TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SQL_PLAN TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$LOCK TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON V_\$SESSION_EVENT TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON DBA_PROCEDURES TO ${DB_USER} CONTAINER=ALL;\nGRANT SELECT ON DBA_OBJECTS TO ${DB_USER} CONTAINER=ALL;\nEXIT;\n' | sudo su - oracle -c 'sqlplus -S / as sysdba'" 2>&1) + GRANT_SQL=$(cat << SQLEOF + WHENEVER SQLERROR EXIT SQL.SQLCODE + ALTER SESSION SET CONTAINER = CDB\$ROOT; + CREATE USER ${DB_USER} IDENTIFIED BY "${NR_PASSWORD}" CONTAINER=ALL; + GRANT CREATE SESSION TO ${DB_USER} CONTAINER=ALL; + ALTER USER ${DB_USER} SET CONTAINER_DATA=ALL CONTAINER=CURRENT; + GRANT SELECT ON V_\$INSTANCE TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$DATABASE TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$CONTAINERS TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$DATAFILE TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$SYSSTAT TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$CON_SYSSTAT TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$SYSMETRIC TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$CON_SYSMETRIC TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$SESSION TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$RESOURCE_LIMIT TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$OSSTAT TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$SGAINFO TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$ROWCACHE TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$PARAMETER TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON CDB_TABLESPACE_USAGE_METRICS TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON CDB_TABLESPACES TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON DBA_DATA_FILES TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON DBA_FREE_SPACE TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON DBA_RECYCLEBIN TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$SQL TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$SQL_PLAN TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$LOCK TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON V_\$SESSION_EVENT TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON DBA_PROCEDURES TO ${DB_USER} CONTAINER=ALL; + GRANT SELECT ON DBA_OBJECTS TO ${DB_USER} CONTAINER=ALL; + EXIT; + SQLEOF + ) else - RESULT=$(ssh -o StrictHostKeyChecking=no -o BatchMode=yes "${SSH_USER}@${HOST}" \ - "printf 'WHENEVER SQLERROR EXIT SQL.SQLCODE\nALTER SESSION SET CONTAINER = \"${PDB_NAME}\";\nCREATE USER ${DB_USER} IDENTIFIED BY \"${NR_PASSWORD}\";\nGRANT CREATE SESSION TO ${DB_USER};\nGRANT SELECT ON V_\$INSTANCE TO ${DB_USER};\nGRANT SELECT ON V_\$DATABASE TO ${DB_USER};\nGRANT SELECT ON V_\$CONTAINERS TO ${DB_USER};\nGRANT SELECT ON V_\$DATAFILE TO ${DB_USER};\nGRANT SELECT ON V_\$SYSSTAT TO ${DB_USER};\nGRANT SELECT ON V_\$SYSMETRIC TO ${DB_USER};\nGRANT SELECT ON V_\$SESSION TO ${DB_USER};\nGRANT SELECT ON V_\$RESOURCE_LIMIT TO ${DB_USER};\nGRANT SELECT ON V_\$OSSTAT TO ${DB_USER};\nGRANT SELECT ON V_\$SGAINFO TO ${DB_USER};\nGRANT SELECT ON V_\$ROWCACHE TO ${DB_USER};\nGRANT SELECT ON V_\$PARAMETER TO ${DB_USER};\nGRANT SELECT ON DBA_TABLESPACE_USAGE_METRICS TO ${DB_USER};\nGRANT SELECT ON DBA_TABLESPACES TO ${DB_USER};\nGRANT SELECT ON DBA_DATA_FILES TO ${DB_USER};\nGRANT SELECT ON DBA_FREE_SPACE TO ${DB_USER};\nGRANT SELECT ON DBA_RECYCLEBIN TO ${DB_USER};\nGRANT SELECT ON V_\$SQL TO ${DB_USER};\nGRANT SELECT ON V_\$SQL_PLAN TO ${DB_USER};\nGRANT SELECT ON V_\$LOCK TO ${DB_USER};\nGRANT SELECT ON V_\$SESSION_EVENT TO ${DB_USER};\nGRANT SELECT ON DBA_PROCEDURES TO ${DB_USER};\nGRANT SELECT ON DBA_OBJECTS TO ${DB_USER};\nGRANT SELECT ON V_\$PDBS TO ${DB_USER};\nEXIT;\n' | sudo su - oracle -c 'sqlplus -S / as sysdba'" 2>&1) + GRANT_SQL=$(cat << SQLEOF + WHENEVER SQLERROR EXIT SQL.SQLCODE + ALTER SESSION SET CONTAINER = "${PDB_NAME}"; + CREATE USER ${DB_USER} IDENTIFIED BY "${NR_PASSWORD}"; + GRANT CREATE SESSION TO ${DB_USER}; + GRANT SELECT ON V_\$INSTANCE TO ${DB_USER}; + GRANT SELECT ON V_\$DATABASE TO ${DB_USER}; + GRANT SELECT ON V_\$CONTAINERS TO ${DB_USER}; + GRANT SELECT ON V_\$DATAFILE TO ${DB_USER}; + GRANT SELECT ON V_\$SYSSTAT TO ${DB_USER}; + GRANT SELECT ON V_\$SYSMETRIC TO ${DB_USER}; + GRANT SELECT ON V_\$SESSION TO ${DB_USER}; + GRANT SELECT ON V_\$RESOURCE_LIMIT TO ${DB_USER}; + GRANT SELECT ON V_\$OSSTAT TO ${DB_USER}; + GRANT SELECT ON V_\$SGAINFO TO ${DB_USER}; + GRANT SELECT ON V_\$ROWCACHE TO ${DB_USER}; + GRANT SELECT ON V_\$PARAMETER TO ${DB_USER}; + GRANT SELECT ON DBA_TABLESPACE_USAGE_METRICS TO ${DB_USER}; + GRANT SELECT ON DBA_TABLESPACES TO ${DB_USER}; + GRANT SELECT ON DBA_DATA_FILES TO ${DB_USER}; + GRANT SELECT ON DBA_FREE_SPACE TO ${DB_USER}; + GRANT SELECT ON DBA_RECYCLEBIN TO ${DB_USER}; + GRANT SELECT ON V_\$SQL TO ${DB_USER}; + GRANT SELECT ON V_\$SQL_PLAN TO ${DB_USER}; + GRANT SELECT ON V_\$LOCK TO ${DB_USER}; + GRANT SELECT ON V_\$SESSION_EVENT TO ${DB_USER}; + GRANT SELECT ON DBA_PROCEDURES TO ${DB_USER}; + GRANT SELECT ON DBA_OBJECTS TO ${DB_USER}; + GRANT SELECT ON V_\$PDBS TO ${DB_USER}; + EXIT; + SQLEOF + ) fi - if [ $? -ne 0 ] || echo "$RESULT" | grep -qi "ORA-"; then + RESULT=$(ssh -o StrictHostKeyChecking=no -o BatchMode=yes "${SSH_USER}@${HOST}" \ + "sudo su - oracle -c 'sqlplus -S / as sysdba'" <<< "$GRANT_SQL" 2>&1) + + SSH_STATUS=$? + REDACT_PATTERN=$(printf '%s' "$NR_PASSWORD" | sed -e 's/[.[\*^$/]/\\&/g') + redact() { + if [ -n "$REDACT_PATTERN" ]; then + sed "s/${REDACT_PATTERN}/[REDACTED]/g" + else + cat + fi + } + + if [ $SSH_STATUS -ne 0 ] || echo "$RESULT" | grep -qi "ORA-"; then echo "SQL script failed:" >&2 - echo "$RESULT" >&2 - rm -f "$PW_FILE" "$USER_FILE" + echo "$RESULT" | redact >&2 exit 1 fi - echo "$RESULT" + echo "$RESULT" | redact + NR_SUCCESS=1 echo "Oracle Database monitoring identity configured successfully: $DB_USER" create_collector_config: diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index 517d20ee6..3e735d2fa 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -105,14 +105,15 @@ install: ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" - VERSION_OUTPUT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << 'SQL' + VERSION_OUTPUT=$(sqlplus -S /nolog << EOF WHENEVER SQLERROR EXIT SQL.SQLCODE + CONNECT ${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME} SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON - SELECT version FROM v$instance; + SELECT version FROM v\$instance; EXIT; - SQL + EOF ) - if [ $? -ne 0 ]; then + if [ $? -ne 0 ] || echo "$VERSION_OUTPUT" | grep -qi "ORA-\|SP2-"; then echo "Failed to connect to the RDS Oracle Database to check its version:" >&2 echo "$VERSION_OUTPUT" >&2 exit 1 @@ -122,6 +123,8 @@ install: if [ -z "$MAJOR_VERSION" ] || [ "$MAJOR_VERSION" -lt 19 ]; then echo "Oracle Database version ${MAJOR_VERSION:-unknown} is not supported. Oracle Database 19c or later is required." >&2 + echo "Raw output from version check:" >&2 + echo "$VERSION_OUTPUT" >&2 exit 1 fi @@ -196,10 +199,13 @@ install: ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" USER_FILE="/tmp/nr-oracle-rds-db-user.tmp" + NR_SUCCESS="" + trap 'if [ "$NR_SUCCESS" != "1" ]; then rm -f "$PW_FILE" "$USER_FILE"; fi' EXIT LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') - EXISTS_RESULT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << SQL 2>&1 + EXISTS_RESULT=$(sqlplus -S /nolog << SQL 2>&1 + CONNECT ${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME} SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF SELECT username FROM dba_users WHERE username='${LOGIN_UPPER}'; EXIT; @@ -228,6 +234,7 @@ install: echo "$LOGIN_NAME" > "$USER_FILE" chmod 600 "$USER_FILE" echo "Using existing user: $LOGIN_NAME" + NR_SUCCESS=1 exit 0 ;; 2) @@ -243,6 +250,12 @@ install: esac fi + if ! printf '%s' "$LOGIN_NAME" | grep -qE '^[A-Za-z][A-Za-z0-9_]*$'; then + echo "Invalid monitoring username: $LOGIN_NAME" >&2 + echo "Usernames must start with a letter and contain only letters, digits, and underscores." >&2 + exit 131 + fi + echo "$LOGIN_NAME" > "$USER_FILE" chmod 600 "$USER_FILE" @@ -254,8 +267,9 @@ install: printf '%s' "$NR_PASSWORD" > "$PW_FILE" chmod 600 "$PW_FILE" - RESULT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << SQL 2>&1 + RESULT=$(sqlplus -S /nolog << SQL 2>&1 WHENEVER SQLERROR EXIT SQL.SQLCODE + CONNECT ${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME} CREATE USER ${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}"; GRANT CONNECT TO ${LOGIN_NAME}; EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SYSMETRIC', '${LOGIN_UPPER}', 'SELECT', false); @@ -293,14 +307,24 @@ install: SQL ) - if [ $? -ne 0 ]; then + SQLPLUS_STATUS=$? + REDACT_PATTERN=$(printf '%s' "$NR_PASSWORD" | sed -e 's/[.[\*^$/]/\\&/g') + redact() { + if [ -n "$REDACT_PATTERN" ]; then + sed "s/${REDACT_PATTERN}/[REDACTED]/g" + else + cat + fi + } + + if [ $SQLPLUS_STATUS -ne 0 ] || echo "$RESULT" | grep -qi "ORA-"; then echo "SQL script failed:" >&2 - echo "$RESULT" >&2 - rm -f "$PW_FILE" "$USER_FILE" + echo "$RESULT" | redact >&2 exit 1 fi - echo "$RESULT" + echo "$RESULT" | redact + NR_SUCCESS=1 echo "RDS Oracle Database monitoring identity configured successfully: $LOGIN_NAME" create_collector_config: diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index a4e9b6387..06ecd0e15 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -109,14 +109,15 @@ install: ADMIN_USER="{{.NR_CLI_ORACLE_ADMIN_USER}}" ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" - VERSION_OUTPUT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << 'SQL' + VERSION_OUTPUT=$(sqlplus -S /nolog << EOF WHENEVER SQLERROR EXIT SQL.SQLCODE + CONNECT ${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME} SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON - SELECT version FROM v$instance; + SELECT version FROM v\$instance; EXIT; - SQL + EOF ) - if [ $? -ne 0 ]; then + if [ $? -ne 0 ] || echo "$VERSION_OUTPUT" | grep -qi "ORA-\|SP2-"; then echo "Failed to connect to the RDS Oracle Database to check its version:" >&2 echo "$VERSION_OUTPUT" >&2 exit 1 @@ -126,6 +127,8 @@ install: if [ -z "$MAJOR_VERSION" ] || [ "$MAJOR_VERSION" -lt 19 ]; then echo "Oracle Database version ${MAJOR_VERSION:-unknown} is not supported. Oracle Database 19c or later is required." >&2 + echo "Raw output from version check:" >&2 + echo "$VERSION_OUTPUT" >&2 exit 1 fi @@ -196,10 +199,13 @@ install: ADMIN_PASSWORD="{{.NR_CLI_ORACLE_ADMIN_PASSWORD}}" PW_FILE="/tmp/nr-oracle-rds-newrelic-pw.tmp" USER_FILE="/tmp/nr-oracle-rds-db-user.tmp" + NR_SUCCESS="" + trap 'if [ "$NR_SUCCESS" != "1" ]; then rm -f "$PW_FILE" "$USER_FILE"; fi' EXIT LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') - EXISTS_RESULT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << SQL 2>&1 + EXISTS_RESULT=$(sqlplus -S /nolog << SQL 2>&1 + CONNECT ${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME} SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF SELECT username FROM dba_users WHERE username='${LOGIN_UPPER}'; EXIT; @@ -228,6 +234,7 @@ install: echo "$LOGIN_NAME" > "$USER_FILE" chmod 600 "$USER_FILE" echo "Using existing user: $LOGIN_NAME" + NR_SUCCESS=1 exit 0 ;; 2) @@ -243,6 +250,12 @@ install: esac fi + if ! printf '%s' "$LOGIN_NAME" | grep -qE '^[A-Za-z][A-Za-z0-9_]*$'; then + echo "Invalid monitoring username: $LOGIN_NAME" >&2 + echo "Usernames must start with a letter and contain only letters, digits, and underscores." >&2 + exit 131 + fi + echo "$LOGIN_NAME" > "$USER_FILE" chmod 600 "$USER_FILE" @@ -254,8 +267,9 @@ install: printf '%s' "$NR_PASSWORD" > "$PW_FILE" chmod 600 "$PW_FILE" - RESULT=$(sqlplus -S "${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME}" << SQL 2>&1 + RESULT=$(sqlplus -S /nolog << SQL 2>&1 WHENEVER SQLERROR EXIT SQL.SQLCODE + CONNECT ${ADMIN_USER}/${ADMIN_PASSWORD}@${HOST}:${PORT}/${SERVICE_NAME} CREATE USER ${LOGIN_NAME} IDENTIFIED BY "${NR_PASSWORD}"; GRANT CONNECT TO ${LOGIN_NAME}; EXEC rdsadmin.rdsadmin_util.grant_sys_object('V_\$SYSMETRIC', '${LOGIN_UPPER}', 'SELECT', false); @@ -293,14 +307,24 @@ install: SQL ) - if [ $? -ne 0 ]; then + SQLPLUS_STATUS=$? + REDACT_PATTERN=$(printf '%s' "$NR_PASSWORD" | sed -e 's/[.[\*^$/]/\\&/g') + redact() { + if [ -n "$REDACT_PATTERN" ]; then + sed "s/${REDACT_PATTERN}/[REDACTED]/g" + else + cat + fi + } + + if [ $SQLPLUS_STATUS -ne 0 ] || echo "$RESULT" | grep -qi "ORA-"; then echo "SQL script failed:" >&2 - echo "$RESULT" >&2 - rm -f "$PW_FILE" "$USER_FILE" + echo "$RESULT" | redact >&2 exit 1 fi - echo "$RESULT" + echo "$RESULT" | redact + NR_SUCCESS=1 echo "RDS Oracle Database monitoring identity configured successfully: $LOGIN_NAME" create_collector_config: From 857e46e979895a8f04147dd790da89bb67d11abc Mon Sep 17 00:00:00 2001 From: RamanaReddy8801 <106150577+RamanaReddy8801@users.noreply.github.com> Date: Mon, 24 Aug 2026 17:53:08 +0530 Subject: [PATCH 30/33] Rename oci-liunx.yml to oci-linux.yml --- .../nrdot/oracle-otel/{oci-liunx.yml => oci-linux.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename recipes/newrelic/infrastructure/nrdot/oracle-otel/{oci-liunx.yml => oci-linux.yml} (100%) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-liunx.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml similarity index 100% rename from recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-liunx.yml rename to recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml From 9ad809a95852945c748617bf14dfb72c01d44c79 Mon Sep 17 00:00:00 2001 From: rreddy Date: Mon, 24 Aug 2026 18:12:18 +0530 Subject: [PATCH 31/33] scope oci-linux.yml installTargets back to oracle only --- .../infrastructure/nrdot/oracle-otel/oci-linux.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml index 90fc8414f..1a6da369d 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml @@ -3,20 +3,16 @@ # WORK IN PROGRESS - not for use. name: nrdot-collector-oracle-linux -displayName: NRDOT Oracle Database (RHEL/OEL) +displayName: NRDOT Oracle Database description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector on RHEL/OEL self-hosted environments repository: https://github.com/newrelic/nrdot-collector-releases installTargets: - type: host os: linux - platform: centos - - type: host - os: linux - platform: redhat - - type: host - os: linux - platform: oracle + platform: "oracle" + platformFamily: rhel + platformVersion: "((7|8|9)\\.?.*)" keywords: - Oracle From e27abe6014176edcf2ebbd9ad5eb6087f082f2c7 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 25 Aug 2026 14:53:39 +0530 Subject: [PATCH 32/33] close remaining review gaps on oracle nrdot recipes --- .../infrastructure/nrdot/oracle-otel/oci-linux.yml | 7 +++++-- .../infrastructure/nrdot/oracle-otel/rds-debian.yml | 9 +++++++++ .../infrastructure/nrdot/oracle-otel/rds-rhel.yml | 9 +++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml index 1a6da369d..1b8968cb7 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml @@ -3,8 +3,8 @@ # WORK IN PROGRESS - not for use. name: nrdot-collector-oracle-linux -displayName: NRDOT Oracle Database -description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector on RHEL/OEL self-hosted environments +displayName: NRDOT Oracle Database (Oracle Linux) +description: New Relic install recipe for Oracle Database monitoring via NRDOT Collector on Oracle Linux (OCI) self-hosted environments repository: https://github.com/newrelic/nrdot-collector-releases installTargets: @@ -1063,6 +1063,9 @@ install: EOF fi + chown nrdot-collector:nrdot-collector "$CONFIG_PATH" + chmod 600 "$CONFIG_PATH" + EXISTING_OPTIONS=$(grep "^OTELCOL_OPTIONS=" "$ENV_FILE" 2>/dev/null | sed 's/^OTELCOL_OPTIONS=//' | tr -d '"') if echo "$EXISTING_OPTIONS" | grep -q -- "--config=${CONFIG_PATH}"; then OTELCOL_OPTIONS="$EXISTING_OPTIONS" diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml index 3e735d2fa..9e46a38c6 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-debian.yml @@ -202,6 +202,12 @@ install: NR_SUCCESS="" trap 'if [ "$NR_SUCCESS" != "1" ]; then rm -f "$PW_FILE" "$USER_FILE"; fi' EXIT + if ! printf '%s' "$LOGIN_NAME" | grep -qE '^[A-Za-z][A-Za-z0-9_]*$'; then + echo "Invalid monitoring username: $LOGIN_NAME" >&2 + echo "Usernames must start with a letter and contain only letters, digits, and underscores." >&2 + exit 131 + fi + LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') EXISTS_RESULT=$(sqlplus -S /nolog << SQL 2>&1 @@ -980,6 +986,9 @@ install: EOF fi + chown nrdot-collector:nrdot-collector "$CONFIG_PATH" + chmod 600 "$CONFIG_PATH" + cat > "$ENV_FILE" << EOF OTELCOL_OPTIONS="--config=${CONFIG_PATH}" EOF diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml index 06ecd0e15..e7f18b9c8 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/rds-rhel.yml @@ -202,6 +202,12 @@ install: NR_SUCCESS="" trap 'if [ "$NR_SUCCESS" != "1" ]; then rm -f "$PW_FILE" "$USER_FILE"; fi' EXIT + if ! printf '%s' "$LOGIN_NAME" | grep -qE '^[A-Za-z][A-Za-z0-9_]*$'; then + echo "Invalid monitoring username: $LOGIN_NAME" >&2 + echo "Usernames must start with a letter and contain only letters, digits, and underscores." >&2 + exit 131 + fi + LOGIN_UPPER=$(echo "$LOGIN_NAME" | tr '[:lower:]' '[:upper:]') EXISTS_RESULT=$(sqlplus -S /nolog << SQL 2>&1 @@ -980,6 +986,9 @@ install: EOF fi + chown nrdot-collector:nrdot-collector "$CONFIG_PATH" + chmod 600 "$CONFIG_PATH" + cat > "$ENV_FILE" << EOF OTELCOL_OPTIONS="--config=${CONFIG_PATH}" EOF From be3bcbdd09083d74cf016844c08b3fe1230d9e89 Mon Sep 17 00:00:00 2001 From: rreddy Date: Tue, 25 Aug 2026 20:01:25 +0530 Subject: [PATCH 33/33] harden SSH host-key verification in oci-linux.yml --- .../newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml b/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml index 1b8968cb7..0527d9291 100644 --- a/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml +++ b/recipes/newrelic/infrastructure/nrdot/oracle-otel/oci-linux.yml @@ -138,7 +138,7 @@ install: exit 131 fi - VERSION_OUTPUT=$(ssh -o StrictHostKeyChecking=no -o BatchMode=yes "${SSH_USER}@${HOST}" \ + VERSION_OUTPUT=$(ssh -o StrictHostKeyChecking=accept-new -o BatchMode=yes "${SSH_USER}@${HOST}" \ "printf 'SET HEADING OFF FEEDBACK OFF PAGESIZE 0 TRIMSPOOL ON\nSELECT version FROM v\$instance;\nEXIT;\n' | sudo su - oracle -c 'sqlplus -S / as sysdba'") if [ -z "$VERSION_OUTPUT" ] || echo "$VERSION_OUTPUT" | grep -qi "ORA-\|error"; then @@ -260,7 +260,7 @@ install: EXIT; SQLEOF ) - EXISTS_RESULT=$(ssh -o StrictHostKeyChecking=no -o BatchMode=yes "${SSH_USER}@${HOST}" \ + EXISTS_RESULT=$(ssh -o StrictHostKeyChecking=accept-new -o BatchMode=yes "${SSH_USER}@${HOST}" \ "sudo su - oracle -c 'sqlplus -S / as sysdba'" <<< "$EXISTS_SQL") || true if echo "$EXISTS_RESULT" | grep -qi "^[[:space:]]*${DB_USER_UPPER}[[:space:]]*$"; then @@ -398,7 +398,7 @@ install: ) fi - RESULT=$(ssh -o StrictHostKeyChecking=no -o BatchMode=yes "${SSH_USER}@${HOST}" \ + RESULT=$(ssh -o StrictHostKeyChecking=accept-new -o BatchMode=yes "${SSH_USER}@${HOST}" \ "sudo su - oracle -c 'sqlplus -S / as sysdba'" <<< "$GRANT_SQL" 2>&1) SSH_STATUS=$?