diff --git a/Dockerfile b/Dockerfile index 61394c2b..362353e0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,8 +13,8 @@ ENV TAGS=${TAGS:-godror} ARG CGO_ENABLED ENV CGO_ENABLED=${CGO_ENABLED:-1} -ARG GO_VERSION -ENV GO_VERSION=${GO_VERSION:-1.24.9} +ARG GO_VERSION=1.24.9 +ENV GO_VERSION=${GO_VERSION} RUN microdnf install wget gzip gcc && \ wget -q https://go.dev/dl/go${GO_VERSION}.${GOOS}-${GOARCH}.tar.gz && \ diff --git a/Makefile b/Makefile index 561698a0..0e753102 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ ARCH_TYPE ?= $(subst x86_64,amd64,$(patsubst i%86,386,$(ARCH))) GOOS ?= $(shell go env GOOS) GOARCH ?= $(shell go env GOARCH) TAGS ?= godror +PLATFORM ?= amd64 DOCKER_TARGET ?= exporter-godror CGO_ENABLED ?= 1 VERSION ?= 2.2.0 @@ -91,11 +92,24 @@ clean: push-images: @make --no-print-directory push-oraclelinux-image -docker: - docker build --no-cache --target=$(DOCKER_TARGET) --progress=plain $(BUILD_ARGS) -t "$(IMAGE_ID)-amd64" --build-arg BASE_IMAGE=$(ORACLE_LINUX_BASE_IMAGE) --build-arg GOARCH=amd64 . +docker: docker-amd docker-arm: - docker buildx build --target=$(DOCKER_TARGET) --platform linux/arm64 --load --no-cache --progress=plain $(BUILD_ARGS) -t "$(IMAGE_ID)-arm64" --build-arg BASE_IMAGE=$(ORACLE_LINUX_BASE_IMAGE) --build-arg GOARCH=arm64 . + @$(MAKE) PLATFORM=arm64 docker-platform + +docker-amd: + @$(MAKE) PLATFORM=amd64 docker-platform + +docker-platform: + @echo "Building Docker image for $(PLATFORM)..." + docker build --no-cache --target=$(DOCKER_TARGET) \ + --platform linux/$(PLATFORM) \ + --progress=plain $(BUILD_ARGS) \ + -t "$(IMAGE_ID)-$(PLATFORM)" \ + --build-arg BASE_IMAGE=$(ORACLE_LINUX_BASE_IMAGE) \ + --build-arg GOARCH=$(PLATFORM) \ + --build-arg CGO_ENABLED=$(CGO_ENABLED) \ + --build-arg TAGS=$(TAGS) . push-oraclelinux-image: docker push $(IMAGE_ID) @@ -112,4 +126,5 @@ podman-push: podman-release: podman-build podman-push -.PHONY: version build deps go-test clean docker podman-build podman-push podman-release +.PHONY: version build deps go-test clean docker docker-arm docker-platform docker-amd \ + podman-build podman-push podman-release \ No newline at end of file diff --git a/THIRD_PARTY_LICENSES.txt b/THIRD_PARTY_LICENSES.txt index 6312741d..2aa6a5c0 100644 --- a/THIRD_PARTY_LICENSES.txt +++ b/THIRD_PARTY_LICENSES.txt @@ -60,7 +60,7 @@ Copyright 2017 Microsoft Corporation. All rights reserved. --------------------------------- (separator) ---------------------------------- == Dependency -github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets == License Type SPDX:MIT @@ -71,7 +71,7 @@ Copyright (c) Microsoft Corporation. All rights reserved. --------------------------------- (separator) ---------------------------------- == Dependency -github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal == License Type SPDX:MIT @@ -105,17 +105,6 @@ Copyright 2010 The Go Authors. All rights reserved. --------------------------------- (separator) ---------------------------------- -== Dependency -github.com/VictoriaMetrics/easyproto - -== License Type -SPDX:Apache-2.0 - -== Copyright -Copyright 2023-2024 VictoriaMetrics, Inc. - ---------------------------------- (separator) ---------------------------------- - == Dependency github.com/alecthomas/kingpin/v2 @@ -209,7 +198,8 @@ Copyright 2019 Square Inc. github.com/gofrs/flock == License Type -=== BSD-3-Clause-4e7459b3 +=== BSD-3-Clause-ccdad8f4 +Copyright (c) 2018-2024, The Gofrs Copyright (c) 2015-2020, Tim Heckman All rights reserved. @@ -244,8 +234,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright (c) 2015-2020, Tim Heckman Copyright 2015 Tim Heckman. All rights reserved. Copyright 2018 The Go Authors. All rights reserved. -Copyright 2018 The Gofrs. All rights reserved. - +Copyright 2018-2024 The Gofrs. All rights reserved. --------------------------------- (separator) ---------------------------------- @@ -1803,4 +1792,4 @@ the Mozilla Public License, v. 2.0. === ATTRIBUTION-HELPER-GENERATED: === Attribution helper version: {Major:0 Minor:11 GitVersion:0.10.0-116-g2a434e4d-dirty GitCommit:2a434e4d7eea22d4dfd2d1cf04909239d05562b1 GitTreeState:dirty BuildDate:2025-04-29T00:30:45Z GoVersion:go1.22.4 Compiler:gc Platform:linux/amd64} -=== License file based on go.mod with md5 sum: 6cc83417e41baf616c93ce69e9c0cbb2 +=== License file based on go.mod with md5 sum: ca4151fddc683472717049863d0b84e9 diff --git a/build-all-macos.sh b/build-all-macos.sh new file mode 100755 index 00000000..91c8d867 --- /dev/null +++ b/build-all-macos.sh @@ -0,0 +1,136 @@ +#!/bin/bash + +# This script builds release artifacts for the Oracle Database Metrics Exporter. +# You must have a working docker socket, and docker or aliased docker command. +# It is designed to run on MacOS aarch64, creating the darwin-arm64 on the local host. +# Artifacts for linux-arm64, linux-amd64 are built in containers. + +# The following artifacts are created on a successful build in the 'dist' directory for the selected database driver target (godror or goora): +# - linux/arm64 and linux/amd64 container images +# - linux/arm64 and linux/amd64 binary tarballs for glibc 2.28 built on OL8 +# - linux/arm64 and linux/amd64 binary tarballs built on the latest Ubuntu distribution +# - darwin-arm64 binary tarball + +# Example usage: +# ./build-all-macos.sh 2.2.0 godror + +USAGE="Usage: $0 [-v VERSION] [-t TARGET] [-cmuo]" + +while getopts "v:t:cmuo" opt; do + case ${opt} in + v ) VERSION=$OPTARG;; # Exporter version + t ) TARGET=$OPTARG;; # Target database driver, may be "godror" or "goora" + c ) BUILD_CONTAINERS=true;; # Build exporter containers + m ) BUILD_DARWIN=true;; # Build darwin/macos binary + u ) BUILD_UBUNTU=true;; # Build binaries on latest Ubuntu + o ) BUILD_OL8=true;; # Build binaries on OL8 + \? ) echo $USAGE; exit 1;; + esac +done + +if [[ -z "$VERSION" ]] || [[ -z "$TARGET" ]]; then + echo $USAGE + exit 1 +fi + +OL_IMAGE="oraclelinux:8" +BASE_IMAGE="ghcr.io/oracle/oraclelinux:8-slim" +UBUNTU_IMAGE="ubuntu:24.04" +OL8_GLIBC_VERSION="2.28" +GO_VERSION="1.24.9" + +if [[ "${TARGET}" == "goora" ]]; then + TAGS="goora" + CGO_ENABLED=0 +else + TAGS="godror" + CGO_ENABLED=1 +fi + +build_darwin_local() { + echo "Build dawrin-arm64" + make go-build + echo "Built for darwin-arm64" +} + +build_ol_platform() { + build_ol "$1" + rename_glibc "$1" +} + +build_ol() { + local platform="$1" + local container="build-${platform}" + local image_artifact="exporter-${platform}" + local image_tar=${image_artifact}.tar + local filename="oracledb_exporter-${VERSION}.linux-${platform}.tar.gz" + + if [[ -n "$BUILD_CONTAINERS" ]]; then + echo "Starting $OL_IMAGE-${platform} build container" + PLATFORM=$platform make docker-platform + fi + + if [[ -n "BUILD_OL8" ]]; then + docker run -d --privileged --platform "linux/${platform}" --name "${container}" "${OL_IMAGE}" tail -f /dev/null + docker exec "${container}" bash -c "dnf install -y wget git make gcc && \ + wget -q https://go.dev/dl/go${GO_VERSION}.linux-${platform}.tar.gz && \ + rm -rf /usr/local/go && \ + tar -C /usr/local -xzf go${GO_VERSION}.linux-${platform}.tar.gz && \ + export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin && \ + git clone --depth 1 https://github.com/oracle/oracle-db-appdev-monitoring.git && \ + cd oracle-db-appdev-monitoring && \ + make go-build TAGS=$TAGS CGO_ENABLED=$CGO_ENABLED" + + docker cp "$container:/oracle-db-appdev-monitoring/dist/$filename" dist + + echo "Build complete for $OL_IMAGE-${platform}" + docker stop "$container" + docker rm "$container" + fi +} + +build_ubuntu() { + local container="ubuntu-build" + docker run -d --platform "linux/amd64" --name "${container}" "${UBUNTU_IMAGE}" tail -f /dev/null + docker exec "${container}" bash -c "apt-get update -y && \ + apt-get -y install podman qemu-user-static golang gcc-aarch64-linux-gnu git make && \ + git clone --depth 1 https://github.com/oracle/oracle-db-appdev-monitoring.git && \ + cd oracle-db-appdev-monitoring && \ + make go-build-linux-amd64 TAGS=$TAGS CGO_ENABLED=$CGO_ENABLED && \ + make go-build-linux-gcc-arm64 TAGS=$TAGS CGO_ENABLED=$CGO_ENABLED" + + + docker cp "$container:/oracle-db-appdev-monitoring/dist/oracledb_exporter-${VERSION}.linux-amd64.tar.gz" dist + docker cp "$container:/oracle-db-appdev-monitoring/dist/oracledb_exporter-${VERSION}.linux-arm64.tar.gz" dist + + docker stop "$container" + docker rm "$container" +} + +rename_glibc() { + local platform="$1" + + local f1="oracledb_exporter-${VERSION}.linux-${platform}.tar.gz" + local f2="oracledb_exporter-${VERSION}.linux-${platform}-glibc-${OL8_GLIBC_VERSION}.tar.gz" + + mv "out/$f1" "out/$f2" 2>/dev/null +} + +# clean dist directory before build +rm -r dist/* 2>/dev/null + +# Create darwin-arm64 artifacts on local host +if [[ -n "$BUILD_DARWIN" ]]; then + build_darwin_local +fi +# Create OL8 linux artifacts and containers for glibc 2.28 +# OL8 Linux artifacts are built on OL8 containers +build_ol_platform "arm64" +build_ol_platform "amd64" + + +if [[ -n "$BUILD_UBUNTU" ]]; then + # Create Linux artifacts and containers + build_ubuntu +fi + diff --git a/create-push-manifest.sh b/create-push-manifest.sh new file mode 100755 index 00000000..72a070dd --- /dev/null +++ b/create-push-manifest.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +VERSION="$1" # Exporter version +REGISTRY="$2" # Container registry/repository + +# Tag the images +docker tag exporter-amd64:latest ${REGISTRY}:${VERSION}-amd64 +docker tag exporter-arm64:latest ${REGISTRY}:${VERSION}-arm64 + +# Push the images +docker push ${REGISTRY}:${VERSION}-amd64 +docker push ${REGISTRY}:${VERSION}-arm64 + +# Create and push the manifest +docker manifest create ${REGISTRY}:${VERSION} ${REGISTRY}:${VERSION}-amd64 ${REGISTRY}:${VERSION}-arm64 +docker manifest push ${REGISTRY}:${VERSION} diff --git a/docker-compose/compose.yaml b/docker-compose/compose.yaml index 214d4f99..e96ed49e 100644 --- a/docker-compose/compose.yaml +++ b/docker-compose/compose.yaml @@ -59,7 +59,7 @@ services: start_period: 30s exporter: - image: container-registry.oracle.com/database/observability-exporter:2.1.0 + image: container-registry.oracle.com/database/observability-exporter:2.2.0 container_name: exporter command: - '--config.file=/exporter/config.yaml' diff --git a/docs/404.html b/docs/404.html index 4db0bdde..b55a4c05 100644 --- a/docs/404.html +++ b/docs/404.html @@ -4,13 +4,13 @@ Page Not Found | Oracle Database Metrics Exporter - - + + -
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

\ No newline at end of file diff --git a/docs/assets/js/017ec70d.9dfdd208.js b/docs/assets/js/017ec70d.9dfdd208.js new file mode 100644 index 00000000..c4c76043 --- /dev/null +++ b/docs/assets/js/017ec70d.9dfdd208.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[5564],{4433:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"configuration/multiple-databases","title":"Multiple Databases","description":"The exporter may be configured to scrape as many databases as needed.","source":"@site/versioned_docs/version-2.1.0/configuration/multiple-databases.md","sourceDirName":"configuration","slug":"/configuration/multiple-databases","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/multiple-databases","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/multiple-databases.md","tags":[],"version":"2.1.0","sidebarPosition":3,"frontMatter":{"title":"Multiple Databases","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Custom Metrics","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/custom-metrics"},"next":{"title":"Oracle Wallet (mTLS)","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oracle-wallet"}}');var o=n(4848),s=n(8453);const i={title:"Multiple Databases",sidebar_position:3},r="Scraping Multiple Databases",l={},c=[{value:"Scraping specific metrics from specific databases",id:"scraping-specific-metrics-from-specific-databases",level:3},{value:"Duplicated database configurations",id:"duplicated-database-configurations",level:3}];function d(e){const a={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.header,{children:(0,o.jsx)(a.h1,{id:"scraping-multiple-databases",children:"Scraping Multiple Databases"})}),"\n",(0,o.jsx)(a.p,{children:"The exporter may be configured to scrape as many databases as needed."}),"\n",(0,o.jsx)(a.p,{children:"You may scrape as many databases as needed by defining named database configurations in the config file."}),"\n",(0,o.jsxs)(a.p,{children:["If you're connecting to multiple databases using mTLS, see ",(0,o.jsx)(a.a,{href:"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oracle-wallet#mtls-for-multiple-databases-with-oracle-wallet",children:"mTLS for multiple databases with Oracle Wallet"})]}),"\n",(0,o.jsx)(a.p,{children:'The following settings configure the exporter to scrape multiple databases, "db1", and "db2", simultaneously:'}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n\n ## As many named database configurations may be defined as needed.\n ## It is recommended to define your database config in the config file, rather than using CLI arguments.\n\n ## Database connection information for the \"db1\" database.\n db1:\n ## Database username\n username: ${DB1_USERNAME}\n ## Database password\n password: ${DB1_PASSWORD}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ### Arbitrary labels to add to each metric scraped from this database\n ## Any labels configured for one database will be added to metrics from\n ## every database, because the same metric names must always have the same\n ## full labelset. If the label isn't set for a particular database, then it\n ## will just be set to an empty string.\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\n db2:\n ## Database username\n username: ${DB2_USERNAME}\n ## Database password\n password: ${DB2_PASSWORD}\n ## Database connection url\n url: localhost:1522/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ### Arbitrary labels to add to each metric scraped from this database\n ## Any labels configured for one database will be added to metrics from\n ## every database, because the same metric names must always have the same\n ## full labelset. If the label isn't set for a particular database, then it\n ## will just be set to an empty string.\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n"})}),"\n",(0,o.jsx)(a.h3,{id:"scraping-specific-metrics-from-specific-databases",children:"Scraping specific metrics from specific databases"}),"\n",(0,o.jsxs)(a.p,{children:["By default, metrics are scraped from every connected database. To expose only certain metrics on specific databases, configure the ",(0,o.jsx)(a.code,{children:"databases"}),' property of a metric. The following metric definition will only be scraped from databases "db2" and "db3":']}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-toml",children:'[[metric]]\ncontext = "db_platform"\nlabels = [ "platform_name" ]\nmetricsdesc = { value = "Database platform" }\nrequest = \'\'\'\nSELECT platform_name, 1 as value FROM gv$database\n\'\'\'\ndatabases = [ "db2", "db3" ]\n'})}),"\n",(0,o.jsxs)(a.p,{children:["If the ",(0,o.jsx)(a.code,{children:"databases"})," array is empty or not provided for a metric, that metric will be scraped from all connected databases."]}),"\n",(0,o.jsx)(a.h3,{id:"duplicated-database-configurations",children:"Duplicated database configurations"}),"\n",(0,o.jsx)(a.p,{children:'If one or more database configurations are "duplicated", that is, using the same URL and username, a WARN message is logged:'}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{children:'msg="duplicated database connections" "database connections"="db1, db2 count=2\n'})})]})}function p(e={}){const{wrapper:a}={...(0,s.R)(),...e.components};return a?(0,o.jsx)(a,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,a,n)=>{n.d(a,{R:()=>i,x:()=>r});var t=n(6540);const o={},s=t.createContext(o);function i(e){const a=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function r(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(s.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/0792e97c.9d8cccce.js b/docs/assets/js/0792e97c.9d8cccce.js new file mode 100644 index 00000000..ed7c005a --- /dev/null +++ b/docs/assets/js/0792e97c.9d8cccce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3145],{7209:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Releases","description":"Information on the exporter releases, changelog, and roadmap.","slug":"/category/releases","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/releases","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Compatibility with Older Database Versions","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/older-versions"},"next":{"title":"Roadmap","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/releases/roadmap"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/08c52de7.781f482a.js b/docs/assets/js/08c52de7.781f482a.js new file mode 100644 index 00000000..9ec74e3d --- /dev/null +++ b/docs/assets/js/08c52de7.781f482a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4541],{889:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"configuration/oci-vault","title":"OCI Vault","description":"Securely load database credentials from OCI Vault.","source":"@site/versioned_docs/version-2.2.0/configuration/oci-vault.md","sourceDirName":"configuration","slug":"/configuration/oci-vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oci-vault","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/configuration/oci-vault.md","tags":[],"version":"2.2.0","sidebarPosition":6,"frontMatter":{"title":"OCI Vault","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"Alert Logs","permalink":"/oracle-db-appdev-monitoring/docs/configuration/alert-logs"},"next":{"title":"Azure Vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/azure-vault"}}');var o=n(4848),r=n(8453);const i={title:"OCI Vault",sidebar_position:6},s="Oracle Cloud Infrastructure (OCI) Vault",c={},l=[{value:"OCI Vault CLI Configuration",id:"oci-vault-cli-configuration",level:3}];function d(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"oracle-cloud-infrastructure-oci-vault",children:"Oracle Cloud Infrastructure (OCI) Vault"})}),"\n",(0,o.jsx)(t.p,{children:"Securely load database credentials from OCI Vault."}),"\n",(0,o.jsxs)(t.p,{children:["Each database in the config file may be configured to use OCI Vault. To load the database username and/or password from OCI Vault, set the ",(0,o.jsx)(t.code,{children:"vault.oci"})," property to contain the OCI Vault OCID, and secret names for the database username/password:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n oci:\n id: \n usernameSecret: \n passwordSecret: \n"})}),"\n",(0,o.jsx)(t.h3,{id:"oci-vault-cli-configuration",children:"OCI Vault CLI Configuration"}),"\n",(0,o.jsx)(t.p,{children:"If using the default database with CLI parameters, the exporter will read the username and password from a secret stored in OCI Vault if you set these two environment variables:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"OCI_VAULT_ID"})," should be set to the OCID of the OCI vault that you wish to use"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"OCI_VAULT_USERNAME_SECRET"})," should be set to the name of the secret in the OCI vault which contains the database username"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"OCI_VAULT_PASSWORD_SECRET"})," should be set to the name of the secret in the OCI vault which contains the database password"]}),"\n"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Note that the process must be running under a user that has the OCI CLI installed and configured correctly to access the desired tenancy and region. The OCI Profile used is ",(0,o.jsx)(t.code,{children:"DEFAULT"}),"."]}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>s});var a=n(6540);const o={},r=a.createContext(o);function i(e){const t=a.useContext(r);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/0b61af68.19a2d4c1.js b/docs/assets/js/0b61af68.19a2d4c1.js deleted file mode 100644 index 8401d373..00000000 --- a/docs/assets/js/0b61af68.19a2d4c1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3645],{2757:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"getting-started/kubernetes","title":"Kubernetes","description":"You can run the exporter in Kubernetes using provided manifests.","source":"@site/versioned_docs/version-2.1.0/getting-started/kubernetes.md","sourceDirName":"getting-started","slug":"/getting-started/kubernetes","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/kubernetes","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/getting-started/kubernetes.md","tags":[],"version":"2.1.0","sidebarPosition":3,"frontMatter":{"title":"Kubernetes","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Default Metrics","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/default-metrics"},"next":{"title":"Grafana Dashboards","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/grafana-dashboards"}}');var a=r(4848),o=r(8453);const s={title:"Kubernetes",sidebar_position:3},i="Kubernetes",c={},l=[{value:"Create a secret with credentials for connecting to the Oracle Database",id:"create-a-secret-with-credentials-for-connecting-to-the-oracle-database",level:3},{value:"Create a config map for the exporter configuration file (recommended)",id:"create-a-config-map-for-the-exporter-configuration-file-recommended",level:3},{value:"Create a config map for the wallet (optional)",id:"create-a-config-map-for-the-wallet-optional",level:3},{value:"Create a config map for your metrics definition file (optional)",id:"create-a-config-map-for-your-metrics-definition-file-optional",level:3},{value:"Deploy the Oracle Database Observability exporter",id:"deploy-the-oracle-database-observability-exporter",level:3},{value:"Create a Kubernetes service for the exporter",id:"create-a-kubernetes-service-for-the-exporter",level:3},{value:"Create a Kubernetes service monitor",id:"create-a-kubernetes-service-monitor",level:3},{value:"Configure a Prometheus target (optional)",id:"configure-a-prometheus-target-optional",level:3}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"kubernetes",children:"Kubernetes"})}),"\n",(0,a.jsx)(t.p,{children:"You can run the exporter in Kubernetes using provided manifests."}),"\n",(0,a.jsxs)(t.p,{children:["To run the exporter in Kubernetes, you must complete the following steps. All steps must be completed in the same Kunernetes namespace. The examples below assume you want to use a namespace called ",(0,a.jsx)(t.code,{children:"exporter"}),", you must change the commands if you wish to use a different namespace."]}),"\n",(0,a.jsx)(t.h3,{id:"create-a-secret-with-credentials-for-connecting-to-the-oracle-database",children:"Create a secret with credentials for connecting to the Oracle Database"}),"\n",(0,a.jsxs)(t.p,{children:["Create a secret with the Oracle database user and password that the exporter should use to connect to the database using this command. You must specify the correct user and password for your environment. This example uses ",(0,a.jsx)(t.code,{children:"pdbadmin"})," as the user and ",(0,a.jsx)(t.code,{children:"Welcome12345"})," as the password:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create secret generic db-secret \\\n --from-literal=username=pdbadmin \\\n --from-literal=password=Welcome12345 \\\n -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-config-map-for-the-exporter-configuration-file-recommended",children:"Create a config map for the exporter configuration file (recommended)"}),"\n",(0,a.jsx)(t.p,{children:"Create a config map with the exporter configuration file (if you are using one) using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create cm metrics-exporter-config \\\n --from-file=metrics-exporter-config.yaml\n"})}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsx)(t.p,{children:"NOTE: It is strongly recommended to migrate to the new config file if you are running version 2.0.0 or later."}),"\n"]}),"\n",(0,a.jsx)(t.h3,{id:"create-a-config-map-for-the-wallet-optional",children:"Create a config map for the wallet (optional)"}),"\n",(0,a.jsxs)(t.p,{children:["Create a config map with the wallet (if you are using one) using this command. Run this command in the ",(0,a.jsx)(t.code,{children:"wallet"})," directory you created earlier."]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create cm db-metrics-tns-admin \\\n --from-file=cwallet.sso \\\n --from-file=ewallet.p12 \\\n --from-file=ewallet.pem \\\n --from-file=keystore.jks \\\n --from-file=ojdbc.properties \\\n --from-file=sqlnet.ora \\\n --from-file=tnsnames.ora \\\n --from-file=truststore.jks \\\n -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-config-map-for-your-metrics-definition-file-optional",children:"Create a config map for your metrics definition file (optional)"}),"\n",(0,a.jsxs)(t.p,{children:["If you have defined any ",(0,a.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics",children:"custom metrics"}),", you must create a config map for the metrics definition file. For example, if you created a configuration file called ",(0,a.jsx)(t.code,{children:"txeventq-metrics.toml"}),", then create the config map with this command:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create cm db-metrics-txeventq-exporter-config \\\n --from-file=txeventq-metrics.toml \\\n -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"deploy-the-oracle-database-observability-exporter",children:"Deploy the Oracle Database Observability exporter"}),"\n",(0,a.jsxs)(t.p,{children:["A sample Kubernetes manifest is provided ",(0,a.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/kubernetes/metrics-exporter-deployment.yaml",children:"here"}),". You must edit this file to set the namespace you wish to use, the database connect string to use, and if you have any custom metrics, you will need to uncomment and customize some sections in this file."]}),"\n",(0,a.jsx)(t.p,{children:"Once you have made the necessary updates, apply the file to your cluster using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl apply -f metrics-exporter-deployment.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:"You can check the deployment was successful and monitor the exporter startup with this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl get pods -n exporter -w\n"})}),"\n",(0,a.jsx)(t.p,{children:"You can view the exporter's logs with this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl logs -f svc/metrics-exporter -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-kubernetes-service-for-the-exporter",children:"Create a Kubernetes service for the exporter"}),"\n",(0,a.jsxs)(t.p,{children:["Create a Kubernetes service to allow access to the exporter pod(s). A sample Kubernetes manifest is provided ",(0,a.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/kubernetes/metrics-exporter-service.yaml",children:"here"}),". You may need to customize this file to update the namespace."]}),"\n",(0,a.jsx)(t.p,{children:"Once you have made any necessary udpates, apply the file to your cluster using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl apply -f metrics-exporter-service.yaml\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-kubernetes-service-monitor",children:"Create a Kubernetes service monitor"}),"\n",(0,a.jsxs)(t.p,{children:["Create a Kubernetes service monitor to tell Prometheus (for example) to collect metrics from the exporter. A sample Kubernetes manifest is provided ",(0,a.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/kubernetes/metrics-service-monitor.yaml",children:"here"}),". You may need to customize this file to update the namespace."]}),"\n",(0,a.jsx)(t.p,{children:"Once you have made any necessary udpates, apply the file to your cluster using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl apply -f metrics-service-monitor.yaml\n"})}),"\n",(0,a.jsx)(t.h3,{id:"configure-a-prometheus-target-optional",children:"Configure a Prometheus target (optional)"}),"\n",(0,a.jsx)(t.p,{children:"You may need to update your Prometheus configuration to add a target. If so, you can use this example job definition as a guide:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",children:" - job_name: 'oracle-exporter'\n metrics_path: '/metrics'\n scrape_interval: 15s\n scrape_timeout: 10s\n static_configs:\n - targets: \n - metrics-exporter.exporter.svc.cluster.local:9161\n"})})]})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>s,x:()=>i});var n=r(6540);const a={},o=n.createContext(a);function s(e){const t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/0b61af68.95d267d6.js b/docs/assets/js/0b61af68.95d267d6.js new file mode 100644 index 00000000..172479b0 --- /dev/null +++ b/docs/assets/js/0b61af68.95d267d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3645],{2757:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"getting-started/kubernetes","title":"Kubernetes","description":"You can run the exporter in Kubernetes using provided manifests.","source":"@site/versioned_docs/version-2.1.0/getting-started/kubernetes.md","sourceDirName":"getting-started","slug":"/getting-started/kubernetes","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/kubernetes","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/getting-started/kubernetes.md","tags":[],"version":"2.1.0","sidebarPosition":3,"frontMatter":{"title":"Kubernetes","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Default Metrics","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/default-metrics"},"next":{"title":"Grafana Dashboards","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/grafana-dashboards"}}');var a=r(4848),o=r(8453);const s={title:"Kubernetes",sidebar_position:3},i="Kubernetes",c={},l=[{value:"Create a secret with credentials for connecting to the Oracle Database",id:"create-a-secret-with-credentials-for-connecting-to-the-oracle-database",level:3},{value:"Create a config map for the exporter configuration file (recommended)",id:"create-a-config-map-for-the-exporter-configuration-file-recommended",level:3},{value:"Create a config map for the wallet (optional)",id:"create-a-config-map-for-the-wallet-optional",level:3},{value:"Create a config map for your metrics definition file (optional)",id:"create-a-config-map-for-your-metrics-definition-file-optional",level:3},{value:"Deploy the Oracle Database Observability exporter",id:"deploy-the-oracle-database-observability-exporter",level:3},{value:"Create a Kubernetes service for the exporter",id:"create-a-kubernetes-service-for-the-exporter",level:3},{value:"Create a Kubernetes service monitor",id:"create-a-kubernetes-service-monitor",level:3},{value:"Configure a Prometheus target (optional)",id:"configure-a-prometheus-target-optional",level:3}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"kubernetes",children:"Kubernetes"})}),"\n",(0,a.jsx)(t.p,{children:"You can run the exporter in Kubernetes using provided manifests."}),"\n",(0,a.jsxs)(t.p,{children:["To run the exporter in Kubernetes, you must complete the following steps. All steps must be completed in the same Kunernetes namespace. The examples below assume you want to use a namespace called ",(0,a.jsx)(t.code,{children:"exporter"}),", you must change the commands if you wish to use a different namespace."]}),"\n",(0,a.jsx)(t.h3,{id:"create-a-secret-with-credentials-for-connecting-to-the-oracle-database",children:"Create a secret with credentials for connecting to the Oracle Database"}),"\n",(0,a.jsxs)(t.p,{children:["Create a secret with the Oracle database user and password that the exporter should use to connect to the database using this command. You must specify the correct user and password for your environment. This example uses ",(0,a.jsx)(t.code,{children:"pdbadmin"})," as the user and ",(0,a.jsx)(t.code,{children:"Welcome12345"})," as the password:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create secret generic db-secret \\\n --from-literal=username=pdbadmin \\\n --from-literal=password=Welcome12345 \\\n -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-config-map-for-the-exporter-configuration-file-recommended",children:"Create a config map for the exporter configuration file (recommended)"}),"\n",(0,a.jsx)(t.p,{children:"Create a config map with the exporter configuration file (if you are using one) using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create cm metrics-exporter-config \\\n --from-file=metrics-exporter-config.yaml\n"})}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsx)(t.p,{children:"NOTE: It is strongly recommended to migrate to the new config file if you are running version 2.0.0 or later."}),"\n"]}),"\n",(0,a.jsx)(t.h3,{id:"create-a-config-map-for-the-wallet-optional",children:"Create a config map for the wallet (optional)"}),"\n",(0,a.jsxs)(t.p,{children:["Create a config map with the wallet (if you are using one) using this command. Run this command in the ",(0,a.jsx)(t.code,{children:"wallet"})," directory you created earlier."]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create cm db-metrics-tns-admin \\\n --from-file=cwallet.sso \\\n --from-file=ewallet.p12 \\\n --from-file=ewallet.pem \\\n --from-file=keystore.jks \\\n --from-file=ojdbc.properties \\\n --from-file=sqlnet.ora \\\n --from-file=tnsnames.ora \\\n --from-file=truststore.jks \\\n -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-config-map-for-your-metrics-definition-file-optional",children:"Create a config map for your metrics definition file (optional)"}),"\n",(0,a.jsxs)(t.p,{children:["If you have defined any ",(0,a.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/custom-metrics",children:"custom metrics"}),", you must create a config map for the metrics definition file. For example, if you created a configuration file called ",(0,a.jsx)(t.code,{children:"txeventq-metrics.toml"}),", then create the config map with this command:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create cm db-metrics-txeventq-exporter-config \\\n --from-file=txeventq-metrics.toml \\\n -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"deploy-the-oracle-database-observability-exporter",children:"Deploy the Oracle Database Observability exporter"}),"\n",(0,a.jsxs)(t.p,{children:["A sample Kubernetes manifest is provided ",(0,a.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/kubernetes/metrics-exporter-deployment.yaml",children:"here"}),". You must edit this file to set the namespace you wish to use, the database connect string to use, and if you have any custom metrics, you will need to uncomment and customize some sections in this file."]}),"\n",(0,a.jsx)(t.p,{children:"Once you have made the necessary updates, apply the file to your cluster using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl apply -f metrics-exporter-deployment.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:"You can check the deployment was successful and monitor the exporter startup with this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl get pods -n exporter -w\n"})}),"\n",(0,a.jsx)(t.p,{children:"You can view the exporter's logs with this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl logs -f svc/metrics-exporter -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-kubernetes-service-for-the-exporter",children:"Create a Kubernetes service for the exporter"}),"\n",(0,a.jsxs)(t.p,{children:["Create a Kubernetes service to allow access to the exporter pod(s). A sample Kubernetes manifest is provided ",(0,a.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/kubernetes/metrics-exporter-service.yaml",children:"here"}),". You may need to customize this file to update the namespace."]}),"\n",(0,a.jsx)(t.p,{children:"Once you have made any necessary udpates, apply the file to your cluster using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl apply -f metrics-exporter-service.yaml\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-kubernetes-service-monitor",children:"Create a Kubernetes service monitor"}),"\n",(0,a.jsxs)(t.p,{children:["Create a Kubernetes service monitor to tell Prometheus (for example) to collect metrics from the exporter. A sample Kubernetes manifest is provided ",(0,a.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/kubernetes/metrics-service-monitor.yaml",children:"here"}),". You may need to customize this file to update the namespace."]}),"\n",(0,a.jsx)(t.p,{children:"Once you have made any necessary udpates, apply the file to your cluster using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl apply -f metrics-service-monitor.yaml\n"})}),"\n",(0,a.jsx)(t.h3,{id:"configure-a-prometheus-target-optional",children:"Configure a Prometheus target (optional)"}),"\n",(0,a.jsx)(t.p,{children:"You may need to update your Prometheus configuration to add a target. If so, you can use this example job definition as a guide:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",children:" - job_name: 'oracle-exporter'\n metrics_path: '/metrics'\n scrape_interval: 15s\n scrape_timeout: 10s\n static_configs:\n - targets: \n - metrics-exporter.exporter.svc.cluster.local:9161\n"})})]})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>s,x:()=>i});var n=r(6540);const a={},o=n.createContext(a);function s(e){const t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/0d3cf460.66980c96.js b/docs/assets/js/0d3cf460.66980c96.js new file mode 100644 index 00000000..9e3335c0 --- /dev/null +++ b/docs/assets/js/0d3cf460.66980c96.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[1129],{1854:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"2.1.0","label":"2.1.0","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-2.1.0","isLast":false,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"OpenTelemetry Metrics for Oracle Database","href":"/oracle-db-appdev-monitoring/docs/2.1.0/intro","docId":"intro","unlisted":false},{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Installation","href":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/basics","docId":"getting-started/basics","unlisted":false},{"type":"link","label":"Default Metrics","href":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/default-metrics","docId":"getting-started/default-metrics","unlisted":false},{"type":"link","label":"Kubernetes","href":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/kubernetes","docId":"getting-started/kubernetes","unlisted":false},{"type":"link","label":"Grafana Dashboards","href":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/grafana-dashboards","docId":"getting-started/grafana-dashboards","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/2.1.0/category/getting-started"},{"type":"category","label":"Configuration","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Exporter Configuration","href":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/config-file","docId":"configuration/config-file","unlisted":false},{"type":"link","label":"Custom Metrics","href":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/custom-metrics","docId":"configuration/custom-metrics","unlisted":false},{"type":"link","label":"Multiple Databases","href":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/multiple-databases","docId":"configuration/multiple-databases","unlisted":false},{"type":"link","label":"Oracle Wallet (mTLS)","href":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oracle-wallet","docId":"configuration/oracle-wallet","unlisted":false},{"type":"link","label":"Alert Logs","href":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/alert-logs","docId":"configuration/alert-logs","unlisted":false},{"type":"link","label":"OCI Vault","href":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oci-vault","docId":"configuration/oci-vault","unlisted":false},{"type":"link","label":"Azure Vault","href":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/azure-vault","docId":"configuration/azure-vault","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/2.1.0/category/configuration"},{"type":"category","label":"Advanced","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuring the Go Runtime","href":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/go-runtime","docId":"advanced/go-runtime","unlisted":false},{"type":"link","label":"Monitoring TxEventQ","href":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/txeventq","docId":"advanced/txeventq","unlisted":false},{"type":"link","label":"Development","href":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/development","docId":"advanced/development","unlisted":false},{"type":"link","label":"Compatibility with Older Database Versions","href":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/older-versions","docId":"advanced/older-versions","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/2.1.0/category/advanced"},{"type":"category","label":"Releases","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Roadmap","href":"/oracle-db-appdev-monitoring/docs/2.1.0/releases/roadmap","docId":"releases/roadmap","unlisted":false},{"type":"link","label":"Changelog","href":"/oracle-db-appdev-monitoring/docs/2.1.0/releases/changelog","docId":"releases/changelog","unlisted":false},{"type":"link","label":"Builds","href":"/oracle-db-appdev-monitoring/docs/2.1.0/releases/builds","docId":"releases/builds","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/2.1.0/category/releases"}]},"docs":{"advanced/development":{"id":"advanced/development","title":"Development","description":"The exporter is a Go program using the Prometheus SDK.","sidebar":"tutorialSidebar"},"advanced/go-runtime":{"id":"advanced/go-runtime","title":"Configuring the Go Runtime","description":"If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter\'s usage of memory.","sidebar":"tutorialSidebar"},"advanced/older-versions":{"id":"advanced/older-versions","title":"Compatibility with Older Database Versions","description":"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.","sidebar":"tutorialSidebar"},"advanced/txeventq":{"id":"advanced/txeventq","title":"Monitoring TxEventQ","description":"Oracle Transactional Event Queues (\\"TxEventQ\\") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.","sidebar":"tutorialSidebar"},"configuration/alert-logs":{"id":"configuration/alert-logs","title":"Alert Logs","description":"Collect export alert logs with a log ingestion tool.","sidebar":"tutorialSidebar"},"configuration/azure-vault":{"id":"configuration/azure-vault","title":"Azure Vault","description":"Securely load database credentials from Azure Vault.","sidebar":"tutorialSidebar"},"configuration/config-file":{"id":"configuration/config-file","title":"Exporter Configuration","description":"The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.","sidebar":"tutorialSidebar"},"configuration/custom-metrics":{"id":"configuration/custom-metrics","title":"Custom Metrics","description":"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.","sidebar":"tutorialSidebar"},"configuration/multiple-databases":{"id":"configuration/multiple-databases","title":"Multiple Databases","description":"The exporter may be configured to scrape as many databases as needed.","sidebar":"tutorialSidebar"},"configuration/oci-vault":{"id":"configuration/oci-vault","title":"OCI Vault","description":"Securely load database credentials from OCI Vault.","sidebar":"tutorialSidebar"},"configuration/oracle-wallet":{"id":"configuration/oracle-wallet","title":"Oracle Wallet (mTLS)","description":"For mutual TLS (mTLS) connections, you must use an Oracle Wallet.","sidebar":"tutorialSidebar"},"getting-started/basics":{"id":"getting-started/basics","title":"Installation","description":"In this section you will find information on running the exporter.","sidebar":"tutorialSidebar"},"getting-started/default-metrics":{"id":"getting-started/default-metrics","title":"Default Metrics","description":"The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.","sidebar":"tutorialSidebar"},"getting-started/grafana-dashboards":{"id":"getting-started/grafana-dashboards","title":"Grafana Dashboards","description":"Sample Grafana dashboards are included with the exporter.","sidebar":"tutorialSidebar"},"getting-started/kubernetes":{"id":"getting-started/kubernetes","title":"Kubernetes","description":"You can run the exporter in Kubernetes using provided manifests.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"OpenTelemetry Metrics for Oracle Database","description":"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.","sidebar":"tutorialSidebar"},"releases/builds":{"id":"releases/builds","title":"Builds","description":"The Oracle Database Metrics Exporter publishes cross-platform builds for each release.","sidebar":"tutorialSidebar"},"releases/changelog":{"id":"releases/changelog","title":"Changelog","description":"List of upcoming and historic changes to the exporter.","sidebar":"tutorialSidebar"},"releases/roadmap":{"id":"releases/roadmap","title":"Roadmap","description":"Planned and upcoming features for the exporter.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/0e384e19.3cab749d.js b/docs/assets/js/0e384e19.51f036a9.js similarity index 53% rename from docs/assets/js/0e384e19.3cab749d.js rename to docs/assets/js/0e384e19.51f036a9.js index f920c6ff..03895719 100644 --- a/docs/assets/js/0e384e19.3cab749d.js +++ b/docs/assets/js/0e384e19.51f036a9.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3976],{2053:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"intro","title":"OpenTelemetry Metrics for Oracle Database","description":"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.","source":"@site/docs/intro.md","sourceDirName":".","slug":"/intro","permalink":"/oracle-db-appdev-monitoring/docs/next/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/intro.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Getting Started","permalink":"/oracle-db-appdev-monitoring/docs/next/category/getting-started"}}');var n=r(4848),s=r(8453);const o={sidebar_position:1},i="OpenTelemetry Metrics for Oracle Database",c={},l=[{value:"Main Features",id:"main-features",level:2},{value:"Supported Oracle Database Versions",id:"supported-oracle-database-versions",level:2},{value:"Acknowledgements",id:"acknowledgements",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"opentelemetry-metrics-for-oracle-database",children:"OpenTelemetry Metrics for Oracle Database"})}),"\n",(0,n.jsx)(t.p,{children:"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere."}),"\n",(0,n.jsx)(t.p,{children:"The metrics supports monitoring multiple database instances, querying default and custom metrics, and ensures that if one database goes offline for maintenance, the rest stay monitored."}),"\n",(0,n.jsx)(t.p,{children:"Over time, this project will provide not just metrics, but also logging and tracing support, and integration into popular frameworks like Spring Boot. The project aims to deliver functionality to support both cloud and on-premises databases, including those running in Kubernetes and containers."}),"\n",(0,n.jsxs)(t.p,{children:["Contributions are welcome - please see ",(0,n.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/CONTRIBUTING.md",children:"contributing"}),"."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Oracle Database Dashboard",src:r(3672).A+"",width:"1256",height:"1460"})}),"\n",(0,n.jsx)(t.h2,{id:"main-features",children:"Main Features"}),"\n",(0,n.jsx)(t.p,{children:"The exporter supports the following main features"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Exports Oracle Database metrics in standard OTEL/Prometheus format"}),"\n",(0,n.jsx)(t.li,{children:"Works with on-prem, in the cloud, and in Kubernetes, with single instance, clustered, or Autonomous Oracle Database instances"}),"\n",(0,n.jsx)(t.li,{children:"Authenticate with plaintext, TLS, and Oracle Wallet"}),"\n",(0,n.jsx)(t.li,{children:"Secure credentials with Oracle Cloud Infrastructure (OCI) Vault or Azure Vault"}),"\n",(0,n.jsx)(t.li,{children:"Load metrics from one or more databases using a single exporter instance"}),"\n",(0,n.jsx)(t.li,{children:"Export the Prometheus Alert Log in JSON format for easy ingest by log aggregators"}),"\n",(0,n.jsx)(t.li,{children:"Pre-buit AMD64 and ARM64 images provided"}),"\n",(0,n.jsx)(t.li,{children:'Standard, default metrics included "out of the box"'}),"\n",(0,n.jsx)(t.li,{children:"Easily define custom metrics using YAML or TOML"}),"\n",(0,n.jsx)(t.li,{children:"Define the scrape interval, database query timeout, and other parameters on a per-metric, per-database level"}),"\n",(0,n.jsx)(t.li,{children:"Customize the database connection pool using go-sql, Oracle Database connection pools, and works with Database Resident Connection Pools"}),"\n",(0,n.jsxs)(t.li,{children:["Includes a sample ",(0,n.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/docker-compose/grafana",children:"Grafana dashboards"})," for inspiration or customization"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"supported-oracle-database-versions",children:"Supported Oracle Database Versions"}),"\n",(0,n.jsx)(t.p,{children:"The Oracle Database Metrics Exporter natively supports Oracle Database versions 19c and 23ai."}),"\n",(0,n.jsx)(t.h2,{id:"acknowledgements",children:"Acknowledgements"}),"\n",(0,n.jsxs)(t.p,{children:["From the v1.0 release onwards, this project provides a ",(0,n.jsx)(t.a,{href:"https://prometheus.io/",children:"Prometheus"})," exporter for Oracle Database based in part on a Prometheus exporter created by ",(0,n.jsx)(t.a,{href:"https://github.com/iamseth/oracledb_exporter",children:"Seth Miller"}),". This project includes changes to comply with various Oracle standards and policies, as well as new features."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:'Seth has archived his exporter as of Feb 13, 2025 and added a note encouraging people to check out ours instead. We wanted to extend a huge "Thank You!" to Seth for the work he did on that exporter, and his contributions to the Oracle and open source communities!'}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},3672:(e,t,r)=>{r.d(t,{A:()=>a});const a=r.p+"assets/images/exporter-running-against-basedb-8d8d9efd9a0bec0eb44e25f40e1cced0.png"},8453:(e,t,r)=>{r.d(t,{R:()=>o,x:()=>i});var a=r(6540);const n={},s=a.createContext(n);function o(e){const t=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3976],{2053:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"intro","title":"OpenTelemetry Metrics for Oracle Database","description":"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.","source":"@site/docs/intro.md","sourceDirName":".","slug":"/intro","permalink":"/oracle-db-appdev-monitoring/docs/next/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/intro.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Getting Started","permalink":"/oracle-db-appdev-monitoring/docs/next/category/getting-started"}}');var n=r(4848),s=r(8453);const o={sidebar_position:1},i="OpenTelemetry Metrics for Oracle Database",c={},l=[{value:"Main Features",id:"main-features",level:2},{value:"Supported Oracle Database Versions",id:"supported-oracle-database-versions",level:2},{value:"Acknowledgements",id:"acknowledgements",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"opentelemetry-metrics-for-oracle-database",children:"OpenTelemetry Metrics for Oracle Database"})}),"\n",(0,n.jsx)(t.p,{children:"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere."}),"\n",(0,n.jsx)(t.p,{children:"The metrics supports monitoring multiple database instances, querying default and custom metrics, and ensures that if one database goes offline for maintenance, the rest stay monitored."}),"\n",(0,n.jsx)(t.p,{children:"Over time, this project will provide not just metrics, but also logging and tracing support, and integration into popular frameworks like Spring Boot. The project aims to deliver functionality to support both cloud and on-premises databases, including those running in Kubernetes and containers."}),"\n",(0,n.jsxs)(t.p,{children:["Contributions are welcome - please see ",(0,n.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/CONTRIBUTING.md",children:"contributing"}),"."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Oracle Database Dashboard",src:r(3672).A+"",width:"1256",height:"1460"})}),"\n",(0,n.jsx)(t.h2,{id:"main-features",children:"Main Features"}),"\n",(0,n.jsx)(t.p,{children:"The exporter supports the following main features"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Exports Oracle Database metrics in standard OTEL/Prometheus format"}),"\n",(0,n.jsx)(t.li,{children:"Works with on-prem, in the cloud, and in Kubernetes, with single instance, clustered, or Autonomous Oracle Database instances"}),"\n",(0,n.jsx)(t.li,{children:"Authenticate with plaintext, TLS, and Oracle Wallet"}),"\n",(0,n.jsx)(t.li,{children:"Secure credentials with Oracle Cloud Infrastructure (OCI) Vault, Azure Vault, or HashiCorp Vault"}),"\n",(0,n.jsx)(t.li,{children:"Load metrics from one or more databases using a single exporter instance"}),"\n",(0,n.jsx)(t.li,{children:"Export the Prometheus Alert Log in JSON format for easy ingest by log aggregators"}),"\n",(0,n.jsx)(t.li,{children:"Pre-buit AMD64 and ARM64 images provided"}),"\n",(0,n.jsx)(t.li,{children:'Standard, default metrics included "out of the box"'}),"\n",(0,n.jsx)(t.li,{children:"Easily define custom metrics using YAML or TOML"}),"\n",(0,n.jsx)(t.li,{children:"Define the scrape interval, database query timeout, and other parameters on a per-metric, per-database level"}),"\n",(0,n.jsx)(t.li,{children:"Customize the database connection pool using go-sql, Oracle Database connection pools, and works with Database Resident Connection Pools"}),"\n",(0,n.jsxs)(t.li,{children:["Includes a sample ",(0,n.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/docker-compose/grafana",children:"Grafana dashboards"})," for inspiration or customization"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"supported-oracle-database-versions",children:"Supported Oracle Database Versions"}),"\n",(0,n.jsx)(t.p,{children:"The Oracle Database Metrics Exporter natively supports Oracle Database versions 19c and 23ai."}),"\n",(0,n.jsx)(t.h2,{id:"acknowledgements",children:"Acknowledgements"}),"\n",(0,n.jsxs)(t.p,{children:["From the v1.0 release onwards, this project provides a ",(0,n.jsx)(t.a,{href:"https://prometheus.io/",children:"Prometheus"})," exporter for Oracle Database based in part on a Prometheus exporter created by ",(0,n.jsx)(t.a,{href:"https://github.com/iamseth/oracledb_exporter",children:"Seth Miller"}),". This project includes changes to comply with various Oracle standards and policies, as well as new features."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:'Seth has archived his exporter as of Feb 13, 2025 and added a note encouraging people to check out ours instead. We wanted to extend a huge "Thank You!" to Seth for the work he did on that exporter, and his contributions to the Oracle and open source communities!'}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},3672:(e,t,r)=>{r.d(t,{A:()=>a});const a=r.p+"assets/images/exporter-running-against-basedb-8d8d9efd9a0bec0eb44e25f40e1cced0.png"},8453:(e,t,r)=>{r.d(t,{R:()=>o,x:()=>i});var a=r(6540);const n={},s=a.createContext(n);function o(e){const t=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/017ec70d.f7b04567.js b/docs/assets/js/1817c592.6ee81186.js similarity index 96% rename from docs/assets/js/017ec70d.f7b04567.js rename to docs/assets/js/1817c592.6ee81186.js index 5f0c1d1c..592bd296 100644 --- a/docs/assets/js/017ec70d.f7b04567.js +++ b/docs/assets/js/1817c592.6ee81186.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[5564],{4433:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"configuration/multiple-databases","title":"Multiple Databases","description":"The exporter may be configured to scrape as many databases as needed.","source":"@site/versioned_docs/version-2.1.0/configuration/multiple-databases.md","sourceDirName":"configuration","slug":"/configuration/multiple-databases","permalink":"/oracle-db-appdev-monitoring/docs/configuration/multiple-databases","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/multiple-databases.md","tags":[],"version":"2.1.0","sidebarPosition":3,"frontMatter":{"title":"Multiple Databases","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Custom Metrics","permalink":"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics"},"next":{"title":"Oracle Wallet (mTLS)","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oracle-wallet"}}');var o=n(4848),s=n(8453);const i={title:"Multiple Databases",sidebar_position:3},r="Scraping Multiple Databases",l={},c=[{value:"Scraping specific metrics from specific databases",id:"scraping-specific-metrics-from-specific-databases",level:3},{value:"Duplicated database configurations",id:"duplicated-database-configurations",level:3}];function d(e){const a={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.header,{children:(0,o.jsx)(a.h1,{id:"scraping-multiple-databases",children:"Scraping Multiple Databases"})}),"\n",(0,o.jsx)(a.p,{children:"The exporter may be configured to scrape as many databases as needed."}),"\n",(0,o.jsx)(a.p,{children:"You may scrape as many databases as needed by defining named database configurations in the config file."}),"\n",(0,o.jsxs)(a.p,{children:["If you're connecting to multiple databases using mTLS, see ",(0,o.jsx)(a.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/oracle-wallet#mtls-for-multiple-databases-with-oracle-wallet",children:"mTLS for multiple databases with Oracle Wallet"})]}),"\n",(0,o.jsx)(a.p,{children:'The following settings configure the exporter to scrape multiple databases, "db1", and "db2", simultaneously:'}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n\n ## As many named database configurations may be defined as needed.\n ## It is recommended to define your database config in the config file, rather than using CLI arguments.\n\n ## Database connection information for the \"db1\" database.\n db1:\n ## Database username\n username: ${DB1_USERNAME}\n ## Database password\n password: ${DB1_PASSWORD}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ### Arbitrary labels to add to each metric scraped from this database\n ## Any labels configured for one database will be added to metrics from\n ## every database, because the same metric names must always have the same\n ## full labelset. If the label isn't set for a particular database, then it\n ## will just be set to an empty string.\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\n db2:\n ## Database username\n username: ${DB2_USERNAME}\n ## Database password\n password: ${DB2_PASSWORD}\n ## Database connection url\n url: localhost:1522/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ### Arbitrary labels to add to each metric scraped from this database\n ## Any labels configured for one database will be added to metrics from\n ## every database, because the same metric names must always have the same\n ## full labelset. If the label isn't set for a particular database, then it\n ## will just be set to an empty string.\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n"})}),"\n",(0,o.jsx)(a.h3,{id:"scraping-specific-metrics-from-specific-databases",children:"Scraping specific metrics from specific databases"}),"\n",(0,o.jsxs)(a.p,{children:["By default, metrics are scraped from every connected database. To expose only certain metrics on specific databases, configure the ",(0,o.jsx)(a.code,{children:"databases"}),' property of a metric. The following metric definition will only be scraped from databases "db2" and "db3":']}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-toml",children:'[[metric]]\ncontext = "db_platform"\nlabels = [ "platform_name" ]\nmetricsdesc = { value = "Database platform" }\nrequest = \'\'\'\nSELECT platform_name, 1 as value FROM gv$database\n\'\'\'\ndatabases = [ "db2", "db3" ]\n'})}),"\n",(0,o.jsxs)(a.p,{children:["If the ",(0,o.jsx)(a.code,{children:"databases"})," array is empty or not provided for a metric, that metric will be scraped from all connected databases."]}),"\n",(0,o.jsx)(a.h3,{id:"duplicated-database-configurations",children:"Duplicated database configurations"}),"\n",(0,o.jsx)(a.p,{children:'If one or more database configurations are "duplicated", that is, using the same URL and username, a WARN message is logged:'}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{children:'msg="duplicated database connections" "database connections"="db1, db2 count=2\n'})})]})}function p(e={}){const{wrapper:a}={...(0,s.R)(),...e.components};return a?(0,o.jsx)(a,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,a,n)=>{n.d(a,{R:()=>i,x:()=>r});var t=n(6540);const o={},s=t.createContext(o);function i(e){const a=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function r(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(s.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[8717],{4623:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"configuration/multiple-databases","title":"Multiple Databases","description":"The exporter may be configured to scrape as many databases as needed.","source":"@site/versioned_docs/version-2.2.0/configuration/multiple-databases.md","sourceDirName":"configuration","slug":"/configuration/multiple-databases","permalink":"/oracle-db-appdev-monitoring/docs/configuration/multiple-databases","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/configuration/multiple-databases.md","tags":[],"version":"2.2.0","sidebarPosition":3,"frontMatter":{"title":"Multiple Databases","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Custom Metrics","permalink":"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics"},"next":{"title":"Oracle Wallet (mTLS)","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oracle-wallet"}}');var o=n(4848),s=n(8453);const i={title:"Multiple Databases",sidebar_position:3},r="Scraping Multiple Databases",l={},c=[{value:"Scraping specific metrics from specific databases",id:"scraping-specific-metrics-from-specific-databases",level:3},{value:"Duplicated database configurations",id:"duplicated-database-configurations",level:3}];function d(e){const a={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.header,{children:(0,o.jsx)(a.h1,{id:"scraping-multiple-databases",children:"Scraping Multiple Databases"})}),"\n",(0,o.jsx)(a.p,{children:"The exporter may be configured to scrape as many databases as needed."}),"\n",(0,o.jsx)(a.p,{children:"You may scrape as many databases as needed by defining named database configurations in the config file."}),"\n",(0,o.jsxs)(a.p,{children:["If you're connecting to multiple databases using mTLS, see ",(0,o.jsx)(a.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/oracle-wallet#mtls-for-multiple-databases-with-oracle-wallet",children:"mTLS for multiple databases with Oracle Wallet"})]}),"\n",(0,o.jsx)(a.p,{children:'The following settings configure the exporter to scrape multiple databases, "db1", and "db2", simultaneously:'}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n\n ## As many named database configurations may be defined as needed.\n ## It is recommended to define your database config in the config file, rather than using CLI arguments.\n\n ## Database connection information for the \"db1\" database.\n db1:\n ## Database username\n username: ${DB1_USERNAME}\n ## Database password\n password: ${DB1_PASSWORD}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ### Arbitrary labels to add to each metric scraped from this database\n ## Any labels configured for one database will be added to metrics from\n ## every database, because the same metric names must always have the same\n ## full labelset. If the label isn't set for a particular database, then it\n ## will just be set to an empty string.\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\n db2:\n ## Database username\n username: ${DB2_USERNAME}\n ## Database password\n password: ${DB2_PASSWORD}\n ## Database connection url\n url: localhost:1522/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ### Arbitrary labels to add to each metric scraped from this database\n ## Any labels configured for one database will be added to metrics from\n ## every database, because the same metric names must always have the same\n ## full labelset. If the label isn't set for a particular database, then it\n ## will just be set to an empty string.\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n"})}),"\n",(0,o.jsx)(a.h3,{id:"scraping-specific-metrics-from-specific-databases",children:"Scraping specific metrics from specific databases"}),"\n",(0,o.jsxs)(a.p,{children:["By default, metrics are scraped from every connected database. To expose only certain metrics on specific databases, configure the ",(0,o.jsx)(a.code,{children:"databases"}),' property of a metric. The following metric definition will only be scraped from databases "db2" and "db3":']}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{className:"language-toml",children:'[[metric]]\ncontext = "db_platform"\nlabels = [ "platform_name" ]\nmetricsdesc = { value = "Database platform" }\nrequest = \'\'\'\nSELECT platform_name, 1 as value FROM gv$database\n\'\'\'\ndatabases = [ "db2", "db3" ]\n'})}),"\n",(0,o.jsxs)(a.p,{children:["If the ",(0,o.jsx)(a.code,{children:"databases"})," array is empty or not provided for a metric, that metric will be scraped from all connected databases."]}),"\n",(0,o.jsx)(a.h3,{id:"duplicated-database-configurations",children:"Duplicated database configurations"}),"\n",(0,o.jsx)(a.p,{children:'If one or more database configurations are "duplicated", that is, using the same URL and username, a WARN message is logged:'}),"\n",(0,o.jsx)(a.pre,{children:(0,o.jsx)(a.code,{children:'msg="duplicated database connections" "database connections"="db1, db2 count=2\n'})})]})}function p(e={}){const{wrapper:a}={...(0,s.R)(),...e.components};return a?(0,o.jsx)(a,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,a,n)=>{n.d(a,{R:()=>i,x:()=>r});var t=n(6540);const o={},s=t.createContext(o);function i(e){const a=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function r(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(s.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1aefe309.28e49fe8.js b/docs/assets/js/1aefe309.28e49fe8.js new file mode 100644 index 00000000..848782e3 --- /dev/null +++ b/docs/assets/js/1aefe309.28e49fe8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3613],{7089:(e,i,r)=>{r.r(i),r.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>u,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"releases/builds","title":"Builds","description":"The Oracle Database Metrics Exporter publishes cross-platform builds for each release.","source":"@site/versioned_docs/version-2.1.0/releases/builds.md","sourceDirName":"releases","slug":"/releases/builds","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/releases/builds","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/releases/builds.md","tags":[],"version":"2.1.0","sidebarPosition":3,"frontMatter":{"title":"Builds","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Changelog","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/releases/changelog"}}');var s=r(4848),l=r(8453);const a={title:"Builds",sidebar_position:3},t=void 0,o={},d=[{value:"Pre-built binaries",id:"pre-built-binaries",level:3},{value:"Container images",id:"container-images",level:3},{value:"Build the Oracle Database Metrics Exporter",id:"build-the-oracle-database-metrics-exporter",level:3},{value:"Install build tools.",id:"install-build-tools",level:4},{value:"How to build metrics exporter binaries",id:"how-to-build-metrics-exporter-binaries",level:4},{value:"How to build metrics exporter container images",id:"how-to-build-metrics-exporter-container-images",level:4}];function c(e){const i={a:"a",code:"code",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.p,{children:"The Oracle Database Metrics Exporter publishes cross-platform builds for each release."}),"\n",(0,s.jsx)(i.p,{children:"Binaries:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"linux/amd64"}),"\n",(0,s.jsx)(i.li,{children:"linux/arm64"}),"\n",(0,s.jsx)(i.li,{children:"darwin/arm64"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Container images:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"linux/amd64"}),"\n",(0,s.jsx)(i.li,{children:"linux/arm64"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"pre-built-binaries",children:"Pre-built binaries"}),"\n",(0,s.jsxs)(i.p,{children:["Download pre-built binaries from the metrics exporter ",(0,s.jsx)(i.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/releases",children:"GitHub Releases page"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.code,{children:"linux-amd64"}),", ",(0,s.jsx)(i.code,{children:"linux-arm64"}),", and ",(0,s.jsx)(i.code,{children:"darwin-arm64"})," binaries are included, built using GLIBC 2.39. If you require a specific target architecture or are using an older verison of GLIBC, it's recommended to build the metrics exporter binary yourself."]}),"\n",(0,s.jsx)(i.h3,{id:"container-images",children:"Container images"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"docker pull container-registry.oracle.com/database/observability-exporter:${VERSION}\n"})}),"\n",(0,s.jsx)(i.h3,{id:"build-the-oracle-database-metrics-exporter",children:"Build the Oracle Database Metrics Exporter"}),"\n",(0,s.jsx)(i.p,{children:"Follow these steps to build the metrics exporter on a Ubuntu Linux system."}),"\n",(0,s.jsx)(i.h4,{id:"install-build-tools",children:"Install build tools."}),"\n",(0,s.jsxs)(i.p,{children:["Note that ",(0,s.jsx)(i.code,{children:"podman"})," and ",(0,s.jsx)(i.code,{children:"qemu-user-static"})," are only required for container builds."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo apt-get -y install podman qemu-user-static golang gcc-aarch64-linux-gnu\n"})}),"\n",(0,s.jsx)(i.h4,{id:"how-to-build-metrics-exporter-binaries",children:"How to build metrics exporter binaries"}),"\n",(0,s.jsx)(i.p,{children:"Linux amd64:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"make go-build-linux-amd64\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Linux arm64 (requires ",(0,s.jsx)(i.code,{children:"gcc-aarch64-linux-gnu"}),"):"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.code,{children:"bash make go-build-linux-gcc-arm64 "})}),"\n",(0,s.jsx)(i.p,{children:"Darwin arm64 (requires MacOS platform compilers):"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"make go-build-darwin-arm64\n"})}),"\n",(0,s.jsx)(i.h4,{id:"how-to-build-metrics-exporter-container-images",children:"How to build metrics exporter container images"}),"\n",(0,s.jsx)(i.p,{children:"Creates multi-arch container builds for linux/amd64 and linux/arm64:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"make podman-build\n"})})]})}function u(e={}){const{wrapper:i}={...(0,l.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,r)=>{r.d(i,{R:()=>a,x:()=>t});var n=r(6540);const s={},l=n.createContext(s);function a(e){const i=n.useContext(l);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function t(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1aefe309.bbdd5937.js b/docs/assets/js/1aefe309.bbdd5937.js deleted file mode 100644 index 90066baa..00000000 --- a/docs/assets/js/1aefe309.bbdd5937.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3613],{7089:(e,i,r)=>{r.r(i),r.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>u,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"releases/builds","title":"Builds","description":"The Oracle Database Metrics Exporter publishes cross-platform builds for each release.","source":"@site/versioned_docs/version-2.1.0/releases/builds.md","sourceDirName":"releases","slug":"/releases/builds","permalink":"/oracle-db-appdev-monitoring/docs/releases/builds","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/releases/builds.md","tags":[],"version":"2.1.0","sidebarPosition":3,"frontMatter":{"title":"Builds","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Changelog","permalink":"/oracle-db-appdev-monitoring/docs/releases/changelog"}}');var s=r(4848),l=r(8453);const a={title:"Builds",sidebar_position:3},t=void 0,o={},d=[{value:"Pre-built binaries",id:"pre-built-binaries",level:3},{value:"Container images",id:"container-images",level:3},{value:"Build the Oracle Database Metrics Exporter",id:"build-the-oracle-database-metrics-exporter",level:3},{value:"Install build tools.",id:"install-build-tools",level:4},{value:"How to build metrics exporter binaries",id:"how-to-build-metrics-exporter-binaries",level:4},{value:"How to build metrics exporter container images",id:"how-to-build-metrics-exporter-container-images",level:4}];function c(e){const i={a:"a",code:"code",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.p,{children:"The Oracle Database Metrics Exporter publishes cross-platform builds for each release."}),"\n",(0,s.jsx)(i.p,{children:"Binaries:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"linux/amd64"}),"\n",(0,s.jsx)(i.li,{children:"linux/arm64"}),"\n",(0,s.jsx)(i.li,{children:"darwin/arm64"}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Container images:"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"linux/amd64"}),"\n",(0,s.jsx)(i.li,{children:"linux/arm64"}),"\n"]}),"\n",(0,s.jsx)(i.h3,{id:"pre-built-binaries",children:"Pre-built binaries"}),"\n",(0,s.jsxs)(i.p,{children:["Download pre-built binaries from the metrics exporter ",(0,s.jsx)(i.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/releases",children:"GitHub Releases page"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.code,{children:"linux-amd64"}),", ",(0,s.jsx)(i.code,{children:"linux-arm64"}),", and ",(0,s.jsx)(i.code,{children:"darwin-arm64"})," binaries are included, built using GLIBC 2.39. If you require a specific target architecture or are using an older verison of GLIBC, it's recommended to build the metrics exporter binary yourself."]}),"\n",(0,s.jsx)(i.h3,{id:"container-images",children:"Container images"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"docker pull container-registry.oracle.com/database/observability-exporter:${VERSION}\n"})}),"\n",(0,s.jsx)(i.h3,{id:"build-the-oracle-database-metrics-exporter",children:"Build the Oracle Database Metrics Exporter"}),"\n",(0,s.jsx)(i.p,{children:"Follow these steps to build the metrics exporter on a Ubuntu Linux system."}),"\n",(0,s.jsx)(i.h4,{id:"install-build-tools",children:"Install build tools."}),"\n",(0,s.jsxs)(i.p,{children:["Note that ",(0,s.jsx)(i.code,{children:"podman"})," and ",(0,s.jsx)(i.code,{children:"qemu-user-static"})," are only required for container builds."]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"sudo apt-get -y install podman qemu-user-static golang gcc-aarch64-linux-gnu\n"})}),"\n",(0,s.jsx)(i.h4,{id:"how-to-build-metrics-exporter-binaries",children:"How to build metrics exporter binaries"}),"\n",(0,s.jsx)(i.p,{children:"Linux amd64:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"make go-build-linux-amd64\n"})}),"\n",(0,s.jsxs)(i.p,{children:["Linux arm64 (requires ",(0,s.jsx)(i.code,{children:"gcc-aarch64-linux-gnu"}),"):"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.code,{children:"bash make go-build-linux-gcc-arm64 "})}),"\n",(0,s.jsx)(i.p,{children:"Darwin arm64 (requires MacOS platform compilers):"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-bash",children:"make go-build-darwin-arm64\n"})}),"\n",(0,s.jsx)(i.h4,{id:"how-to-build-metrics-exporter-container-images",children:"How to build metrics exporter container images"}),"\n",(0,s.jsx)(i.p,{children:"Creates multi-arch container builds for linux/amd64 and linux/arm64:"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"make podman-build\n"})})]})}function u(e={}){const{wrapper:i}={...(0,l.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,r)=>{r.d(i,{R:()=>a,x:()=>t});var n=r(6540);const s={},l=n.createContext(s);function a(e){const i=n.useContext(l);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function t(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(l.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1dda82ab.ab0b04a3.js b/docs/assets/js/1dda82ab.ab0b04a3.js new file mode 100644 index 00000000..3263e1db --- /dev/null +++ b/docs/assets/js/1dda82ab.ab0b04a3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[9006],{900:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>s,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"getting-started/kubernetes","title":"Kubernetes","description":"You can run the exporter in Kubernetes using provided manifests.","source":"@site/versioned_docs/version-2.2.0/getting-started/kubernetes.md","sourceDirName":"getting-started","slug":"/getting-started/kubernetes","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/kubernetes","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/getting-started/kubernetes.md","tags":[],"version":"2.2.0","sidebarPosition":3,"frontMatter":{"title":"Kubernetes","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Default Metrics","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/default-metrics"},"next":{"title":"Grafana Dashboards","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/grafana-dashboards"}}');var a=r(4848),o=r(8453);const s={title:"Kubernetes",sidebar_position:3},i="Kubernetes",c={},l=[{value:"Create a secret with credentials for connecting to the Oracle Database",id:"create-a-secret-with-credentials-for-connecting-to-the-oracle-database",level:3},{value:"Create a config map for the exporter configuration file (recommended)",id:"create-a-config-map-for-the-exporter-configuration-file-recommended",level:3},{value:"Create a config map for the wallet (optional)",id:"create-a-config-map-for-the-wallet-optional",level:3},{value:"Create a config map for your metrics definition file (optional)",id:"create-a-config-map-for-your-metrics-definition-file-optional",level:3},{value:"Deploy the Oracle Database Observability exporter",id:"deploy-the-oracle-database-observability-exporter",level:3},{value:"Create a Kubernetes service for the exporter",id:"create-a-kubernetes-service-for-the-exporter",level:3},{value:"Create a Kubernetes service monitor",id:"create-a-kubernetes-service-monitor",level:3},{value:"Configure a Prometheus target (optional)",id:"configure-a-prometheus-target-optional",level:3}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"kubernetes",children:"Kubernetes"})}),"\n",(0,a.jsx)(t.p,{children:"You can run the exporter in Kubernetes using provided manifests."}),"\n",(0,a.jsxs)(t.p,{children:["To run the exporter in Kubernetes, you must complete the following steps. All steps must be completed in the same Kunernetes namespace. The examples below assume you want to use a namespace called ",(0,a.jsx)(t.code,{children:"exporter"}),", you must change the commands if you wish to use a different namespace."]}),"\n",(0,a.jsx)(t.h3,{id:"create-a-secret-with-credentials-for-connecting-to-the-oracle-database",children:"Create a secret with credentials for connecting to the Oracle Database"}),"\n",(0,a.jsxs)(t.p,{children:["Create a secret with the Oracle database user and password that the exporter should use to connect to the database using this command. You must specify the correct user and password for your environment. This example uses ",(0,a.jsx)(t.code,{children:"pdbadmin"})," as the user and ",(0,a.jsx)(t.code,{children:"Welcome12345"})," as the password:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create secret generic db-secret \\\n --from-literal=username=pdbadmin \\\n --from-literal=password=Welcome12345 \\\n -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-config-map-for-the-exporter-configuration-file-recommended",children:"Create a config map for the exporter configuration file (recommended)"}),"\n",(0,a.jsx)(t.p,{children:"Create a config map with the exporter configuration file (if you are using one) using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create cm metrics-exporter-config \\\n --from-file=metrics-exporter-config.yaml\n"})}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsx)(t.p,{children:"NOTE: It is strongly recommended to migrate to the new config file if you are running version 2.0.0 or later."}),"\n"]}),"\n",(0,a.jsx)(t.h3,{id:"create-a-config-map-for-the-wallet-optional",children:"Create a config map for the wallet (optional)"}),"\n",(0,a.jsxs)(t.p,{children:["Create a config map with the wallet (if you are using one) using this command. Run this command in the ",(0,a.jsx)(t.code,{children:"wallet"})," directory you created earlier."]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create cm db-metrics-tns-admin \\\n --from-file=cwallet.sso \\\n --from-file=ewallet.p12 \\\n --from-file=ewallet.pem \\\n --from-file=keystore.jks \\\n --from-file=ojdbc.properties \\\n --from-file=sqlnet.ora \\\n --from-file=tnsnames.ora \\\n --from-file=truststore.jks \\\n -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-config-map-for-your-metrics-definition-file-optional",children:"Create a config map for your metrics definition file (optional)"}),"\n",(0,a.jsxs)(t.p,{children:["If you have defined any ",(0,a.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics",children:"custom metrics"}),", you must create a config map for the metrics definition file. For example, if you created a configuration file called ",(0,a.jsx)(t.code,{children:"txeventq-metrics.toml"}),", then create the config map with this command:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl create cm db-metrics-txeventq-exporter-config \\\n --from-file=txeventq-metrics.toml \\\n -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"deploy-the-oracle-database-observability-exporter",children:"Deploy the Oracle Database Observability exporter"}),"\n",(0,a.jsxs)(t.p,{children:["A sample Kubernetes manifest is provided ",(0,a.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/kubernetes/metrics-exporter-deployment.yaml",children:"here"}),". You must edit this file to set the namespace you wish to use, the database connect string to use, and if you have any custom metrics, you will need to uncomment and customize some sections in this file."]}),"\n",(0,a.jsx)(t.p,{children:"Once you have made the necessary updates, apply the file to your cluster using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl apply -f metrics-exporter-deployment.yaml\n"})}),"\n",(0,a.jsx)(t.p,{children:"You can check the deployment was successful and monitor the exporter startup with this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl get pods -n exporter -w\n"})}),"\n",(0,a.jsx)(t.p,{children:"You can view the exporter's logs with this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl logs -f svc/metrics-exporter -n exporter\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-kubernetes-service-for-the-exporter",children:"Create a Kubernetes service for the exporter"}),"\n",(0,a.jsxs)(t.p,{children:["Create a Kubernetes service to allow access to the exporter pod(s). A sample Kubernetes manifest is provided ",(0,a.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/kubernetes/metrics-exporter-service.yaml",children:"here"}),". You may need to customize this file to update the namespace."]}),"\n",(0,a.jsx)(t.p,{children:"Once you have made any necessary udpates, apply the file to your cluster using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl apply -f metrics-exporter-service.yaml\n"})}),"\n",(0,a.jsx)(t.h3,{id:"create-a-kubernetes-service-monitor",children:"Create a Kubernetes service monitor"}),"\n",(0,a.jsxs)(t.p,{children:["Create a Kubernetes service monitor to tell Prometheus (for example) to collect metrics from the exporter. A sample Kubernetes manifest is provided ",(0,a.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/kubernetes/metrics-service-monitor.yaml",children:"here"}),". You may need to customize this file to update the namespace."]}),"\n",(0,a.jsx)(t.p,{children:"Once you have made any necessary udpates, apply the file to your cluster using this command:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:"kubectl apply -f metrics-service-monitor.yaml\n"})}),"\n",(0,a.jsx)(t.h3,{id:"configure-a-prometheus-target-optional",children:"Configure a Prometheus target (optional)"}),"\n",(0,a.jsx)(t.p,{children:"You may need to update your Prometheus configuration to add a target. If so, you can use this example job definition as a guide:"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",children:" - job_name: 'oracle-exporter'\n metrics_path: '/metrics'\n scrape_interval: 15s\n scrape_timeout: 10s\n static_configs:\n - targets: \n - metrics-exporter.exporter.svc.cluster.local:9161\n"})})]})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>s,x:()=>i});var n=r(6540);const a={},o=n.createContext(a);function s(e){const t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1e10f605.7484ef29.js b/docs/assets/js/1e10f605.8ff0793c.js similarity index 99% rename from docs/assets/js/1e10f605.7484ef29.js rename to docs/assets/js/1e10f605.8ff0793c.js index 08a91c1f..72330fb9 100644 --- a/docs/assets/js/1e10f605.7484ef29.js +++ b/docs/assets/js/1e10f605.8ff0793c.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[5071],{7848:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"configuration/custom-metrics","title":"Custom Metrics","description":"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.","source":"@site/docs/configuration/custom-metrics.md","sourceDirName":"configuration","slug":"/configuration/custom-metrics","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/custom-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/configuration/custom-metrics.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Custom Metrics","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Exporter Configuration","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/config-file"},"next":{"title":"Multiple Databases","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/multiple-databases"}}');var r=i(4848),n=i(8453);const l={title:"Custom Metrics",sidebar_position:2},a="Custom Metrics",c={},o=[{value:"Metric Hot Reload",id:"metric-hot-reload",level:3},{value:"Metric Schema",id:"metric-schema",level:3},{value:"Example Metric Definition",id:"example-metric-definition",level:3},{value:"Override Existing, Individual Metrics",id:"override-existing-individual-metrics",level:4},{value:"YAML Metrics",id:"yaml-metrics",level:3},{value:"Customize metrics in a container image",id:"customize-metrics-in-a-container-image",level:3}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"custom-metrics",children:"Custom Metrics"})}),"\n",(0,r.jsx)(t.p,{children:"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files."}),"\n",(0,r.jsxs)(t.p,{children:["To specify custom metrics files\nexporter, use the ",(0,r.jsx)(t.code,{children:"metrics"})," configuration in the ",(0,r.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/config-file",children:"config file"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"metrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files (TOML or YAML)\n custom:\n - custom-metrics-example/custom-metrics.toml\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You may also use ",(0,r.jsx)(t.code,{children:"--custom.metrics"})," flag followed by a comma separated list of TOML or YAML files, or export ",(0,r.jsx)(t.code,{children:"CUSTOM_METRICS"})," variable environment (",(0,r.jsx)(t.code,{children:"export CUSTOM_METRICS=my-custom-metrics.toml,my-other-custom-metrics.toml"}),")"]}),"\n",(0,r.jsx)(t.h3,{id:"metric-hot-reload",children:"Metric Hot Reload"}),"\n",(0,r.jsx)(t.p,{children:"The exporter watches for changes in custom metrics. When these files change, the exporter hot reloads the metrics definition, and serves the new metrics on the next scrape."}),"\n",(0,r.jsx)(t.h3,{id:"metric-schema",children:"Metric Schema"}),"\n",(0,r.jsxs)(t.p,{children:["Metrics files must contain a series of ",(0,r.jsx)(t.code,{children:"[[metric]]"})," definitions, in TOML, or the equivalent definition in a YAML file. Each metric definition must follow the exporter's metric schema:"]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Field Name"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Required"}),(0,r.jsx)(t.th,{children:"Default"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"context"}),(0,r.jsx)(t.td,{children:"Metric context, used to build metric FQN"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"labels"}),(0,r.jsx)(t.td,{children:"Metric labels, which must match column names in the query. Any column that is not a label will be parsed as a metric"}),(0,r.jsx)(t.td,{children:"Array of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricsdesc"}),(0,r.jsx)(t.td,{children:"Mapping between field(s) in the request and comment(s)"}),(0,r.jsx)(t.td,{children:"Dictionary of Strings"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricstype"}),(0,r.jsxs)(t.td,{children:["Mapping between field(s) in the request and ",(0,r.jsx)(t.a,{href:"https://prometheus.io/docs/concepts/metric_types/",children:"Prometheus metric types"})]}),(0,r.jsx)(t.td,{children:"Dictionary of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricsbuckets"}),(0,r.jsxs)(t.td,{children:["Split ",(0,r.jsx)(t.a,{href:"https://prometheus.io/docs/concepts/metric_types/#histogram",children:"histogram"})," metric types into buckets based on value (",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/metric-histogram-example.toml",children:"example"}),")"]}),(0,r.jsx)(t.td,{children:"Dictionary of String dictionaries"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"fieldtoappend"}),(0,r.jsxs)(t.td,{children:["Field from the request to append to the metric FQN. This field will ",(0,r.jsx)(t.strong,{children:"not"})," be included in the metric labels."]}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"request"}),(0,r.jsx)(t.td,{children:"Oracle database query to run for metrics scraping"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignorezeroresult"}),(0,r.jsx)(t.td,{children:"Whether or not an error will be printed if the request does not return any results"}),(0,r.jsx)(t.td,{children:"Boolean"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"false"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"querytimeout"}),(0,r.jsx)(t.td,{children:"Oracle Database query timeout duration, e.g., 300ms, 0.5h"}),(0,r.jsx)(t.td,{children:"String duration"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Value of query.timeout in seconds"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"scrapeinterval"}),(0,r.jsx)(t.td,{children:"Custom metric scrape interval. If the metric was already scraped during the specified interval, a cached value is provided."}),(0,r.jsx)(t.td,{children:"String duration"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"databases"}),(0,r.jsxs)(t.td,{children:["Array of databases the metric will be scraped from, using the database name from the exporter config file. If not present, the metric is scraped from all databases. If the databases array is empty (",(0,r.jsx)(t.code,{children:"databases = []"}),") the metric will not be scraped, effectively being disabled."]}),(0,r.jsx)(t.td,{children:"Array of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"example-metric-definition",children:"Example Metric Definition"}),"\n",(0,r.jsx)(t.p,{children:"Here's a simple example of a metric definition:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "test"\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n'})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsxs)(t.p,{children:["NOTE: Do not add a semicolon (",(0,r.jsx)(t.code,{children:";"}),") at the end of the SQL queries."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"This file produce the following entries in the exporter:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"# HELP oracledb_test_value_1 Simple example returning always 1.\n# TYPE oracledb_test_value_1 gauge\noracledb_test_value_1 1\n# HELP oracledb_test_value_2 Same but returning always 2.\n# TYPE oracledb_test_value_2 gauge\noracledb_test_value_2 2\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can also provide labels using ",(0,r.jsx)(t.code,{children:"labels"})," field. Here's an example providing two metrics, with and without labels:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "context_no_label"\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n\n[[metric]]\ncontext = "context_with_labels"\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2, \'First label\' as label_1, \'Second label\' as label_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n'})}),"\n",(0,r.jsx)(t.p,{children:"This TOML file produces the following result:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:'# HELP oracledb_context_no_label_value_1 Simple example returning always 1.\n# TYPE oracledb_context_no_label_value_1 gauge\noracledb_context_no_label_value_1 1\n# HELP oracledb_context_no_label_value_2 Same but returning always 2.\n# TYPE oracledb_context_no_label_value_2 gauge\noracledb_context_no_label_value_2 2\n# HELP oracledb_context_with_labels_value_1 Simple example returning always 1.\n# TYPE oracledb_context_with_labels_value_1 gauge\noracledb_context_with_labels_value_1{label_1="First label",label_2="Second label"} 1\n# HELP oracledb_context_with_labels_value_2 Same but returning always 2.\n# TYPE oracledb_context_with_labels_value_2 gauge\noracledb_context_with_labels_value_2{label_1="First label",label_2="Second label"} 2\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Last, you can set metric type using ",(0,r.jsx)(t.strong,{children:"metricstype"})," field."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "context_with_labels"\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2, \'First label\' as label_1, \'Second label\' as label_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1 as counter.", value_2 = "Same but returning always 2 as gauge." }\n# Can be counter or gauge (default)\nmetricstype = { value_1 = "counter" }\n'})}),"\n",(0,r.jsx)(t.p,{children:"This TOML file will produce the following result:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"# HELP oracledb_test_value_1 Simple test example returning always 1 as counter.\n# TYPE oracledb_test_value_1 counter\noracledb_test_value_1 1\n# HELP oracledb_test_value_2 Same test but returning always 2 as gauge.\n# TYPE oracledb_test_value_2 gauge\noracledb_test_value_2 2\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can find ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/custom-metrics.toml",children:"working examples"})," of custom metrics for slow queries, big queries and top 100 tables.\nAn example of ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/txeventq-metrics.toml",children:"custom metrics for Transacational Event Queues"})," is also provided."]}),"\n",(0,r.jsx)(t.h4,{id:"override-existing-individual-metrics",children:"Override Existing, Individual Metrics"}),"\n",(0,r.jsxs)(t.p,{children:["You may override properties for existing metrics by supplying a new, custom metric definition with the same ",(0,r.jsx)(t.code,{children:"context"})," and ",(0,r.jsx)(t.code,{children:"metricsdesc"})," values. For example, if you have an existing metric like so:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "my_default_metric"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\n'})}),"\n",(0,r.jsxs)(t.p,{children:["You can redefine this metric in a custom metrics file to change any properties other than ",(0,r.jsx)(t.code,{children:"context"})," or ",(0,r.jsx)(t.code,{children:"metricsdesc"}),". For example, overriding the previous metric with ",(0,r.jsx)(t.code,{children:"labels"}),", ",(0,r.jsx)(t.code,{children:"scrapeinterval"}),", and ",(0,r.jsx)(t.code,{children:"querytimeout"})," properties:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "my_default_metric"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nscrapeinterval = "30s"\nquerytimeout = "10s"\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Then, provide any metrics overrides as custom metrics files in the ",(0,r.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/config-file",children:"exporter configuration file"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"metrics:\n ## Paths to any custom metrics files\n custom:\n - my-custom-metrics.toml\n"})}),"\n",(0,r.jsx)(t.p,{children:"If any metric appears more than once in the custom metrics file list, the metric definition in the last file provided takes precedence."}),"\n",(0,r.jsx)(t.h3,{id:"yaml-metrics",children:"YAML Metrics"}),"\n",(0,r.jsx)(t.p,{children:"Metrics may be defined with YAML instead of TOML. YAML metric field names correspond to TOML metric field names."}),"\n",(0,r.jsxs)(t.p,{children:["YAML metrics are defined as a list of ",(0,r.jsx)(t.code,{children:"metrics"})," objects:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:'metrics:\n - context: "sessions"\n labels: [ "inst_id", "status", "type" ]\n metricsdesc:\n value: "Gauge metric with count of sessions by inst_id, status and type."\n request: |\n select inst_id, status, type, count(*) as value\n from gv$session\n group by inst_id, status, type\n'})}),"\n",(0,r.jsxs)(t.p,{children:["The default metrics are provided in YAML format as an example. See ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/default-metrics.yaml",children:"default-metrics.yaml"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"customize-metrics-in-a-container-image",children:"Customize metrics in a container image"}),"\n",(0,r.jsxs)(t.p,{children:["If you run the exporter as a container image and want to include your custom metrics in the image itself, you can use the following example ",(0,r.jsx)(t.code,{children:"Dockerfile"})," to create a new image:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-Dockerfile",children:'FROM container-registry.oracle.com/database/observability-exporter:2.1.0\nCOPY custom-metrics.toml /\nENTRYPOINT ["/oracledb_exporter", "--custom.metrics", "/custom-metrics.toml"]\n'})})]})}function m(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>l,x:()=>a});var s=i(6540);const r={},n=s.createContext(r);function l(e){const t=s.useContext(n);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[5071],{7848:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"configuration/custom-metrics","title":"Custom Metrics","description":"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.","source":"@site/docs/configuration/custom-metrics.md","sourceDirName":"configuration","slug":"/configuration/custom-metrics","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/custom-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/configuration/custom-metrics.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Custom Metrics","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Exporter Configuration","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/config-file"},"next":{"title":"Multiple Databases","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/multiple-databases"}}');var r=i(4848),n=i(8453);const l={title:"Custom Metrics",sidebar_position:2},a="Custom Metrics",c={},o=[{value:"Metric Hot Reload",id:"metric-hot-reload",level:3},{value:"Metric Schema",id:"metric-schema",level:3},{value:"Example Metric Definition",id:"example-metric-definition",level:3},{value:"Override Existing, Individual Metrics",id:"override-existing-individual-metrics",level:4},{value:"YAML Metrics",id:"yaml-metrics",level:3},{value:"Customize metrics in a container image",id:"customize-metrics-in-a-container-image",level:3}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"custom-metrics",children:"Custom Metrics"})}),"\n",(0,r.jsx)(t.p,{children:"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files."}),"\n",(0,r.jsxs)(t.p,{children:["To specify custom metrics files\nexporter, use the ",(0,r.jsx)(t.code,{children:"metrics"})," configuration in the ",(0,r.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/config-file",children:"config file"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"metrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files (TOML or YAML)\n custom:\n - custom-metrics-example/custom-metrics.toml\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You may also use ",(0,r.jsx)(t.code,{children:"--custom.metrics"})," flag followed by a comma separated list of TOML or YAML files, or export ",(0,r.jsx)(t.code,{children:"CUSTOM_METRICS"})," variable environment (",(0,r.jsx)(t.code,{children:"export CUSTOM_METRICS=my-custom-metrics.toml,my-other-custom-metrics.toml"}),")"]}),"\n",(0,r.jsx)(t.h3,{id:"metric-hot-reload",children:"Metric Hot Reload"}),"\n",(0,r.jsx)(t.p,{children:"The exporter watches for changes in custom metrics. When these files change, the exporter hot reloads the metrics definition, and serves the new metrics on the next scrape."}),"\n",(0,r.jsx)(t.h3,{id:"metric-schema",children:"Metric Schema"}),"\n",(0,r.jsxs)(t.p,{children:["Metrics files must contain a series of ",(0,r.jsx)(t.code,{children:"[[metric]]"})," definitions, in TOML, or the equivalent definition in a YAML file. Each metric definition must follow the exporter's metric schema:"]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Field Name"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Required"}),(0,r.jsx)(t.th,{children:"Default"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"context"}),(0,r.jsx)(t.td,{children:"Metric context, used to build metric FQN"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"labels"}),(0,r.jsx)(t.td,{children:"Metric labels, which must match column names in the query. Any column that is not a label will be parsed as a metric"}),(0,r.jsx)(t.td,{children:"Array of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricsdesc"}),(0,r.jsx)(t.td,{children:"Mapping between field(s) in the request and comment(s)"}),(0,r.jsx)(t.td,{children:"Dictionary of Strings"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricstype"}),(0,r.jsxs)(t.td,{children:["Mapping between field(s) in the request and ",(0,r.jsx)(t.a,{href:"https://prometheus.io/docs/concepts/metric_types/",children:"Prometheus metric types"})]}),(0,r.jsx)(t.td,{children:"Dictionary of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricsbuckets"}),(0,r.jsxs)(t.td,{children:["Split ",(0,r.jsx)(t.a,{href:"https://prometheus.io/docs/concepts/metric_types/#histogram",children:"histogram"})," metric types into buckets based on value (",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/metric-histogram-example.toml",children:"example"}),")"]}),(0,r.jsx)(t.td,{children:"Dictionary of String dictionaries"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"fieldtoappend"}),(0,r.jsxs)(t.td,{children:["Field from the request to append to the metric FQN. This field will ",(0,r.jsx)(t.strong,{children:"not"})," be included in the metric labels."]}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"request"}),(0,r.jsx)(t.td,{children:"Oracle database query to run for metrics scraping"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignorezeroresult"}),(0,r.jsx)(t.td,{children:"Whether or not an error will be printed if the request does not return any results"}),(0,r.jsx)(t.td,{children:"Boolean"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"false"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"querytimeout"}),(0,r.jsx)(t.td,{children:"Oracle Database query timeout duration, e.g., 300ms, 0.5h"}),(0,r.jsx)(t.td,{children:"String duration"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Value of query.timeout in seconds"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"scrapeinterval"}),(0,r.jsx)(t.td,{children:"Custom metric scrape interval. If the metric was already scraped during the specified interval, a cached value is provided."}),(0,r.jsx)(t.td,{children:"String duration"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"databases"}),(0,r.jsxs)(t.td,{children:["Array of databases the metric will be scraped from, using the database name from the exporter config file. If not present, the metric is scraped from all databases. If the databases array is empty (",(0,r.jsx)(t.code,{children:"databases = []"}),") the metric will not be scraped, effectively being disabled."]}),(0,r.jsx)(t.td,{children:"Array of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"example-metric-definition",children:"Example Metric Definition"}),"\n",(0,r.jsx)(t.p,{children:"Here's a simple example of a metric definition:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "test"\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n'})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsxs)(t.p,{children:["NOTE: Do not add a semicolon (",(0,r.jsx)(t.code,{children:";"}),") at the end of the SQL queries."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"This file produce the following entries in the exporter:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"# HELP oracledb_test_value_1 Simple example returning always 1.\n# TYPE oracledb_test_value_1 gauge\noracledb_test_value_1 1\n# HELP oracledb_test_value_2 Same but returning always 2.\n# TYPE oracledb_test_value_2 gauge\noracledb_test_value_2 2\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can also provide labels using ",(0,r.jsx)(t.code,{children:"labels"})," field. Here's an example providing two metrics, with and without labels:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "context_no_label"\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n\n[[metric]]\ncontext = "context_with_labels"\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2, \'First label\' as label_1, \'Second label\' as label_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n'})}),"\n",(0,r.jsx)(t.p,{children:"This TOML file produces the following result:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:'# HELP oracledb_context_no_label_value_1 Simple example returning always 1.\n# TYPE oracledb_context_no_label_value_1 gauge\noracledb_context_no_label_value_1 1\n# HELP oracledb_context_no_label_value_2 Same but returning always 2.\n# TYPE oracledb_context_no_label_value_2 gauge\noracledb_context_no_label_value_2 2\n# HELP oracledb_context_with_labels_value_1 Simple example returning always 1.\n# TYPE oracledb_context_with_labels_value_1 gauge\noracledb_context_with_labels_value_1{label_1="First label",label_2="Second label"} 1\n# HELP oracledb_context_with_labels_value_2 Same but returning always 2.\n# TYPE oracledb_context_with_labels_value_2 gauge\noracledb_context_with_labels_value_2{label_1="First label",label_2="Second label"} 2\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Last, you can set metric type using ",(0,r.jsx)(t.strong,{children:"metricstype"})," field."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "context_with_labels"\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2, \'First label\' as label_1, \'Second label\' as label_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1 as counter.", value_2 = "Same but returning always 2 as gauge." }\n# Can be counter or gauge (default)\nmetricstype = { value_1 = "counter" }\n'})}),"\n",(0,r.jsx)(t.p,{children:"This TOML file will produce the following result:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"# HELP oracledb_test_value_1 Simple test example returning always 1 as counter.\n# TYPE oracledb_test_value_1 counter\noracledb_test_value_1 1\n# HELP oracledb_test_value_2 Same test but returning always 2 as gauge.\n# TYPE oracledb_test_value_2 gauge\noracledb_test_value_2 2\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can find ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/custom-metrics.toml",children:"working examples"})," of custom metrics for slow queries, big queries and top 100 tables.\nAn example of ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/txeventq-metrics.toml",children:"custom metrics for Transacational Event Queues"})," is also provided."]}),"\n",(0,r.jsx)(t.h4,{id:"override-existing-individual-metrics",children:"Override Existing, Individual Metrics"}),"\n",(0,r.jsxs)(t.p,{children:["You may override properties for existing metrics by supplying a new, custom metric definition with the same ",(0,r.jsx)(t.code,{children:"context"})," and ",(0,r.jsx)(t.code,{children:"metricsdesc"})," values. For example, if you have an existing metric like so:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "my_default_metric"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\n'})}),"\n",(0,r.jsxs)(t.p,{children:["You can redefine this metric in a custom metrics file to change any properties other than ",(0,r.jsx)(t.code,{children:"context"})," or ",(0,r.jsx)(t.code,{children:"metricsdesc"}),". For example, overriding the previous metric with ",(0,r.jsx)(t.code,{children:"labels"}),", ",(0,r.jsx)(t.code,{children:"scrapeinterval"}),", and ",(0,r.jsx)(t.code,{children:"querytimeout"})," properties:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "my_default_metric"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nscrapeinterval = "30s"\nquerytimeout = "10s"\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Then, provide any metrics overrides as custom metrics files in the ",(0,r.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/config-file",children:"exporter configuration file"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"metrics:\n ## Paths to any custom metrics files\n custom:\n - my-custom-metrics.toml\n"})}),"\n",(0,r.jsx)(t.p,{children:"If any metric appears more than once in the custom metrics file list, the metric definition in the last file provided takes precedence."}),"\n",(0,r.jsx)(t.h3,{id:"yaml-metrics",children:"YAML Metrics"}),"\n",(0,r.jsx)(t.p,{children:"Metrics may be defined with YAML instead of TOML. YAML metric field names correspond to TOML metric field names."}),"\n",(0,r.jsxs)(t.p,{children:["YAML metrics are defined as a list of ",(0,r.jsx)(t.code,{children:"metrics"})," objects:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:'metrics:\n - context: "sessions"\n labels: [ "inst_id", "status", "type" ]\n metricsdesc:\n value: "Gauge metric with count of sessions by inst_id, status and type."\n request: |\n select inst_id, status, type, count(*) as value\n from gv$session\n group by inst_id, status, type\n'})}),"\n",(0,r.jsxs)(t.p,{children:["The default metrics are provided in YAML format as an example. See ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/default-metrics.yaml",children:"default-metrics.yaml"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"customize-metrics-in-a-container-image",children:"Customize metrics in a container image"}),"\n",(0,r.jsxs)(t.p,{children:["If you run the exporter as a container image and want to include your custom metrics in the image itself, you can use the following example ",(0,r.jsx)(t.code,{children:"Dockerfile"})," to create a new image:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-Dockerfile",children:'FROM container-registry.oracle.com/database/observability-exporter:2.2.0\nCOPY custom-metrics.toml /\nENTRYPOINT ["/oracledb_exporter", "--custom.metrics", "/custom-metrics.toml"]\n'})})]})}function m(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>l,x:()=>a});var s=i(6540);const r={},n=s.createContext(r);function l(e){const t=s.useContext(n);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1ed3dd51.71e3692a.js b/docs/assets/js/1ed3dd51.71e3692a.js new file mode 100644 index 00000000..48d7d8cf --- /dev/null +++ b/docs/assets/js/1ed3dd51.71e3692a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[7420],{2162:(e,a,t)=>{t.d(a,{A:()=>r});const r=t.p+"assets/images/oracledb-dashboard-cac23ad464ac40e39bf6348f688daa1d.png"},4551:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"getting-started/grafana-dashboards","title":"Grafana Dashboards","description":"Sample Grafana dashboards are included with the exporter.","source":"@site/versioned_docs/version-2.1.0/getting-started/grafana-dashboards.md","sourceDirName":"getting-started","slug":"/getting-started/grafana-dashboards","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/grafana-dashboards","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/getting-started/grafana-dashboards.md","tags":[],"version":"2.1.0","sidebarPosition":4,"frontMatter":{"title":"Grafana Dashboards","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Kubernetes","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/kubernetes"},"next":{"title":"Configuration","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/configuration"}}');var s=t(4848),n=t(8453);const o={title:"Grafana Dashboards",sidebar_position:4},i="Grafana Dashboards",d={},c=[];function h(e){const a={a:"a",h1:"h1",header:"header",img:"img",p:"p",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"grafana-dashboards",children:"Grafana Dashboards"})}),"\n",(0,s.jsx)(a.p,{children:"Sample Grafana dashboards are included with the exporter."}),"\n",(0,s.jsxs)(a.p,{children:["A sample Grafana dashboard definition is provided ",(0,s.jsx)(a.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/docker-compose/grafana/dashboards",children:"in this directory"}),". You can import these dashboards into your Grafana instance, and set it to use the Prometheus datasource that you have defined for the Prometheus instance that is collecting metrics from the exporter."]}),"\n",(0,s.jsx)(a.p,{children:"The dashboard shows some basic information, as shown below:"}),"\n",(0,s.jsx)(a.p,{children:(0,s.jsx)(a.img,{alt:"Oracle Database Dashboard",src:t(2162).A+"",width:"1904",height:"1203"})})]})}function l(e={}){const{wrapper:a}={...(0,n.R)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,a,t)=>{t.d(a,{R:()=>o,x:()=>i});var r=t(6540);const s={},n=r.createContext(s);function o(e){const a=r.useContext(n);return r.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function i(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(n.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1ed3dd51.8010e02c.js b/docs/assets/js/1ed3dd51.8010e02c.js deleted file mode 100644 index 2354fdf7..00000000 --- a/docs/assets/js/1ed3dd51.8010e02c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[7420],{2162:(e,a,t)=>{t.d(a,{A:()=>r});const r=t.p+"assets/images/oracledb-dashboard-cac23ad464ac40e39bf6348f688daa1d.png"},4551:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"getting-started/grafana-dashboards","title":"Grafana Dashboards","description":"Sample Grafana dashboards are included with the exporter.","source":"@site/versioned_docs/version-2.1.0/getting-started/grafana-dashboards.md","sourceDirName":"getting-started","slug":"/getting-started/grafana-dashboards","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/grafana-dashboards","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/getting-started/grafana-dashboards.md","tags":[],"version":"2.1.0","sidebarPosition":4,"frontMatter":{"title":"Grafana Dashboards","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Kubernetes","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/kubernetes"},"next":{"title":"Configuration","permalink":"/oracle-db-appdev-monitoring/docs/category/configuration"}}');var s=t(4848),n=t(8453);const o={title:"Grafana Dashboards",sidebar_position:4},i="Grafana Dashboards",d={},c=[];function h(e){const a={a:"a",h1:"h1",header:"header",img:"img",p:"p",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"grafana-dashboards",children:"Grafana Dashboards"})}),"\n",(0,s.jsx)(a.p,{children:"Sample Grafana dashboards are included with the exporter."}),"\n",(0,s.jsxs)(a.p,{children:["A sample Grafana dashboard definition is provided ",(0,s.jsx)(a.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/docker-compose/grafana/dashboards",children:"in this directory"}),". You can import these dashboards into your Grafana instance, and set it to use the Prometheus datasource that you have defined for the Prometheus instance that is collecting metrics from the exporter."]}),"\n",(0,s.jsx)(a.p,{children:"The dashboard shows some basic information, as shown below:"}),"\n",(0,s.jsx)(a.p,{children:(0,s.jsx)(a.img,{alt:"Oracle Database Dashboard",src:t(2162).A+"",width:"1904",height:"1203"})})]})}function l(e={}){const{wrapper:a}={...(0,n.R)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,a,t)=>{t.d(a,{R:()=>o,x:()=>i});var r=t(6540);const s={},n=r.createContext(s);function o(e){const a=r.useContext(n);return r.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function i(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(n.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/2110d48d.5ddd5a76.js b/docs/assets/js/2110d48d.5ddd5a76.js new file mode 100644 index 00000000..ce8e55fb --- /dev/null +++ b/docs/assets/js/2110d48d.5ddd5a76.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4731],{954:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"releases/changelog","title":"Changelog","description":"List of upcoming and historic changes to the exporter.","source":"@site/versioned_docs/version-2.2.0/releases/changelog.md","sourceDirName":"releases","slug":"/releases/changelog","permalink":"/oracle-db-appdev-monitoring/docs/releases/changelog","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/releases/changelog.md","tags":[],"version":"2.2.0","sidebarPosition":2,"frontMatter":{"title":"Changelog","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Roadmap","permalink":"/oracle-db-appdev-monitoring/docs/releases/roadmap"},"next":{"title":"Builds","permalink":"/oracle-db-appdev-monitoring/docs/releases/builds"}}');var r=n(4848),t=n(8453);const l={title:"Changelog",sidebar_position:2},o="Release Notes",a={},d=[{value:"Version 2.2.0, October 28, 2025",id:"version-220-october-28-2025",level:3},{value:"Version 2.1.0, September 29, 2025",id:"version-210-september-29-2025",level:3},{value:"Version 2.0.4, September 8, 2025",id:"version-204-september-8-2025",level:3},{value:"Version 2.0.3, August 27, 2025",id:"version-203-august-27-2025",level:3},{value:"Version 2.0.2, June 24, 2025",id:"version-202-june-24-2025",level:3},{value:"Version 2.0.1, June 12, 2025",id:"version-201-june-12-2025",level:3},{value:"Version 2.0.0, May 27, 2025",id:"version-200-may-27-2025",level:3},{value:"Version 1.6.1, May 2, 2025",id:"version-161-may-2-2025",level:3},{value:"Version 1.6.0, April 18, 2025",id:"version-160-april-18-2025",level:3},{value:"Version 1.5.5, March 13, 2025",id:"version-155-march-13-2025",level:3},{value:"Version 1.5.4, March 3, 2025",id:"version-154-march-3-2025",level:3},{value:"Version 1.5.3, January 28, 2025",id:"version-153-january-28-2025",level:3},{value:"Version 1.5.2, December 2, 2024",id:"version-152-december-2-2024",level:3},{value:"Version 1.5.1, October 28, 2024",id:"version-151-october-28-2024",level:3},{value:"Version 1.5.0, September 26, 2024",id:"version-150-september-26-2024",level:3},{value:"Version 1.4.0, September 4, 2024",id:"version-140-september-4-2024",level:3},{value:"Version 1.3.1, July 22, 2024",id:"version-131-july-22-2024",level:3},{value:"Version 1.3.0, June 7, 2024",id:"version-130-june-7-2024",level:3},{value:"Version 1.2.1, April 16, 2024",id:"version-121-april-16-2024",level:3},{value:"Version 1.2.0, January 17, 2024",id:"version-120-january-17-2024",level:3},{value:"Version 1.1.1, November 28, 2023",id:"version-111-november-28-2023",level:3},{value:"Version 1.1, October 27, 2023",id:"version-11-october-27-2023",level:3},{value:"Version 1.0, September 13, 2023",id:"version-10-september-13-2023",level:3}];function c(e){const i={a:"a",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"release-notes",children:"Release Notes"})}),"\n",(0,r.jsx)(i.p,{children:"List of upcoming and historic changes to the exporter."}),"\n",(0,r.jsx)(i.h3,{id:"version-220-october-28-2025",children:"Version 2.2.0, October 28, 2025"}),"\n",(0,r.jsx)(i.p,{children:"Our current priorities to support metrics for advanced database features and use cases, like Exadata, GoldenGate, and views included in the Oracle Diagnostics Pack."}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Allow loading database credentials from ",(0,r.jsx)(i.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/hashicorp-vault",children:"HashiCorp Vault"}),"."]}),"\n",(0,r.jsxs)(i.li,{children:["Added experimental support for the ",(0,r.jsx)(i.a,{href:"https://github.com/sijms/go-ora",children:"go-ora"})]}),"\n",(0,r.jsxs)(i.li,{children:["Move ",(0,r.jsx)(i.code,{children:"oracledb_dbtype"})," metric to the default metrics. You may now disable or override this metric like any other database metric."]}),"\n",(0,r.jsx)(i.li,{children:"Document required database permissions for the exporter."}),"\n",(0,r.jsx)(i.li,{children:"Fix an issue where some metrics would not be cached when using a per-metric scrape interval with a global scrape interval."}),"\n",(0,r.jsx)(i.li,{children:"Update third party dependencies"}),"\n",(0,r.jsx)(i.li,{children:"Update Go runtime to 1.24.9"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/MansuyDavid",children:"@MansuyDavid"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/jdagemark",children:"@jdagemark"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/ilmarkerm",children:"@ilmarkerm"})}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-210-september-29-2025",children:"Version 2.1.0, September 29, 2025"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Updated project dependencies."}),"\n",(0,r.jsx)(i.li,{children:"Standardize multi-arch builds and document supported database versions."}),"\n",(0,r.jsx)(i.li,{children:"The metrics override capability is extended, allowing users to redefine individual existing metrics in custom metrics files. This allows users to modify individual default metrics without wholly replacing the default metrics file."}),"\n",(0,r.jsx)(i.li,{children:"If the exporter fails to connect to a database due to invalid or locked credentials (ORA-01017 or ORA-28000 errors), that database configuration will be invalidated and the exporter will not attempt to re-establish the database connection. Other databases will continue to be scraped."}),"\n",(0,r.jsxs)(i.li,{children:["Metrics with an empty databases array (",(0,r.jsx)(i.code,{children:"databases = []"}),") are now considered disabled, and will not be scraped."]}),"\n",(0,r.jsxs)(i.li,{children:["Increased the default query timeout for the ",(0,r.jsx)(i.code,{children:"top_sql"})," metric to 10 seconds (previously 5 seconds)."]}),"\n",(0,r.jsxs)(i.li,{children:["Metrics using the ",(0,r.jsx)(i.code,{children:"scrapeinterval"})," property will no longer be scraped on every request if they have a cached value. This only applies when the metrics exporter is configured to scrape metrics ",(0,r.jsx)(i.em,{children:"on request"}),", rather than on a global interval."]}),"\n",(0,r.jsxs)(i.li,{children:["Metrics using the ",(0,r.jsx)(i.code,{children:"fieldtoappend"})," property now support labels. The ",(0,r.jsx)(i.code,{children:"wait_time"})," and ",(0,r.jsx)(i.code,{children:"activity"})," default metrics use the ",(0,r.jsx)(i.code,{children:"fieldtoappend"})," property, and now properly display their labels."]}),"\n",(0,r.jsxs)(i.li,{children:["Fix ",(0,r.jsx)(i.code,{children:"wait_time"})," default metric to work with Oracle Database 19c."]}),"\n",(0,r.jsx)(i.li,{children:"Fix an issue where the exporter would unnecessarily scrape metrics with a custom scrape interval."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/romankspb",children:"@romankspb"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/muhammadabdullah-amjad",children:"@muhammadabdullah-amjad"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/MansuyDavid",children:"@MansuyDavid"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/borkoz",children:"@borkoz"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/ristagg",children:"@ristagg"})}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-204-september-8-2025",children:"Version 2.0.4, September 8, 2025"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Added WARN logging when database configurations are duplicated in the exporter configuration."}),"\n",(0,r.jsxs)(i.li,{children:["Added INST_ID to ",(0,r.jsx)(i.code,{children:"gv$"})," query metrics as a label."]}),"\n",(0,r.jsx)(i.li,{children:"Fixed multiple concurrency bugs when the exporter is connected to multiple databases and using a custom scrape interval."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/Supporterino",children:"@Supporterino"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/msafdal",children:"@msafdal"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/aberinnj",children:"@aberinnj"})}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-203-august-27-2025",children:"Version 2.0.3, August 27, 2025"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Enable configuration of the prometheus webserver from the config file using the ",(0,r.jsx)(i.code,{children:"web"})," prefix."]}),"\n",(0,r.jsx)(i.li,{children:"Allow loading of database password(s) from a file."}),"\n",(0,r.jsx)(i.li,{children:"Fixed a bug where database type (CDB, PDB, etc.) was not reported in certain situations."}),"\n",(0,r.jsxs)(i.li,{children:["Fixed a bug where literal passwords containing the '$' character (in the config file) would be evaluated as environment variables. To use literal passwords with the '$' character, escape the '$' character with a second '$': ",(0,r.jsx)(i.code,{children:"$test$pwd"})," becomes ",(0,r.jsx)(i.code,{children:"$$test$$pwd"}),"."]}),"\n",(0,r.jsxs)(i.li,{children:["Fixed a bug when using ",(0,r.jsx)(i.code,{children:"metrics.scrapeInterval"})," combined with per-metric scrape intervals that made the available metrics data set inconsistent."]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/Supporterino",children:"@Supporterino"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/aberinnj",children:"@aberinnj"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/redelang",children:"@redelang"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/qrkop",children:"@qrkop"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/KevDi",children:"@KevDi"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/bomuva",children:"@bomuva"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/anilmoris",children:"@anilmoris"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/Sycri",children:"@Sycri"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/kizuna-lek",children:"@kizuna-lek"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/rfrozza",children:"@rfrozza"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-202-june-24-2025",children:"Version 2.0.2, June 24, 2025"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Fixed a case-sensitive issue with resource name in the default metrics file."}),"\n",(0,r.jsx)(i.li,{children:"Add query timeouts to initial database connections, which could cause the exporter to hang in multi-database configurations"}),"\n",(0,r.jsx)(i.li,{children:"Fix an issue where rapidly acquiring connections could cause the exporter to crash. This was more common in multi-database configurations, due to the increased number of connection pools."}),"\n",(0,r.jsx)(i.li,{children:"Update some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/rfrozza",children:"@rfrozza"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/rafal-szypulka",children:"@rafal-szypulka"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/darkelfit",children:"@darkelfit"})}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-201-june-12-2025",children:"Version 2.0.1, June 12, 2025"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Use gv$ views instead of v$ views to allow collection of metrics from all instances in a cluster. (In preparation for RAC support)."}),"\n",(0,r.jsx)(i.li,{children:"Update some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-200-may-27-2025",children:"Version 2.0.0, May 27, 2025"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Fixed an issue with ",(0,r.jsx)(i.code,{children:"scrapeinterval"})," that could cause metrics not to be scraped (#172, #176)."]}),"\n",(0,r.jsxs)(i.li,{children:["Added configuration through a YAML file, passed using the ",(0,r.jsx)(i.code,{children:"--config.file"})," command-line argument. Backwards compatibility is maintained for the command-line arguments, through it is recommended to use the configuration file from the 2.0.0 release onward. It is not recommended to use a combination of command-line arguments and the configuration file."]}),"\n",(0,r.jsx)(i.li,{children:"Added support for multiple databases through the configuration file. As many database instances may be specified as needed, which will be scraped concurrently (#89)."}),"\n",(0,r.jsx)(i.li,{children:"Updated provided dashboards."}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-161-may-2-2025",children:"Version 1.6.1, May 2, 2025"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Deepak A."}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-160-april-18-2025",children:"Version 1.6.0, April 18, 2025"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Added support for Azure Key Vault (#200)."}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.a,{href:"https://github.com/4Aiur",children:"4Aiur"})," added missing grants for alert log to the demo environment (#207)."]}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Brian, Damian et al."}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/4Aiur",children:"4Aiur"})}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-155-march-13-2025",children:"Version 1.5.5, March 13, 2025"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.a,{href:"https://github.com/VictorErmakov",children:"@VictorErmakov"})," updated the docker-compose sample with connection pool parameters to avoid fast connect cycling (#191)."]}),"\n",(0,r.jsx)(i.li,{children:"Update default values for connection pool parameters to use go-sql pooling by default to avoid fast connet cycling."}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/VictorErmakov",children:"@VictorErmakov"})}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-154-march-3-2025",children:"Version 1.5.4, March 3, 2025"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Based of this recommendation from ",(0,r.jsx)(i.a,{href:"https://github.com/godror/godror?tab=readme-ov-file#pooling",children:"godror"}),", which relates to the two following items, and in discussion with the ODPI-C team, we have introduced additional parameters to allow you to set connection pool parameters, and have set defaults which will avoid fast connect cycling. It is our expectation that a fix may be produced in the underlying ODPI-C library for the underlying issue. In the mean time, these changes will avoid the conditions under which the error can occur."]}),"\n",(0,r.jsx)(i.li,{children:"Fix malloc error (#177, #181)."}),"\n",(0,r.jsx)(i.li,{children:"Fix intermittent connection issues with ADB-S when exporter is run in a container (#169)."}),"\n",(0,r.jsx)(i.li,{children:"Fix Multiple custom metrics files overwrite one another (#179)."}),"\n",(0,r.jsx)(i.li,{children:"Replace go-kit/log with log/slog, due to upstream changes in prometheus/common."}),"\n",(0,r.jsxs)(i.li,{children:["Add support for additional admin roles, expanding list of options for ",(0,r.jsx)(i.code,{children:"DB_ROLE"})," to ",(0,r.jsx)(i.code,{children:"SYSDBA"}),", ",(0,r.jsx)(i.code,{children:"SYSOPER"}),", ",(0,r.jsx)(i.code,{children:"SYSBACKUP"}),", ",(0,r.jsx)(i.code,{children:"SYSDG"}),", ",(0,r.jsx)(i.code,{children:"SYSKM"}),", ",(0,r.jsx)(i.code,{children:"SYSRAC"})," and ",(0,r.jsx)(i.code,{children:"SYSASM"})," (#180)."]}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/Jman1993",children:"@Jman1993"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/oey",children:"@oey"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/jlembeck06",children:"@jlembeck06"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/Jman1993",children:"@Jman1993"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/PeterP55P",children:"@PeterP55P"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/rlagyu0",children:"@rlagyu0"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/Sycri",children:"@Sycri"})}),"\n"]}),"\n",(0,r.jsxs)(i.p,{children:["Thank you to ",(0,r.jsx)(i.a,{href:"https://github.com/tgulacsi",children:"@tgulacsi"})," for changes in godror (",(0,r.jsx)(i.a,{href:"https://github.com/godror/godror/issues/361",children:"https://github.com/godror/godror/issues/361"}),", ",(0,r.jsx)(i.a,{href:"https://github.com/godror/godror/issues/360",children:"https://github.com/godror/godror/issues/360"}),"), and to ",(0,r.jsx)(i.a,{href:"https://github.com/cjbj",children:"@cjbj"})," and ",(0,r.jsx)(i.a,{href:"https://github.com/sudarshan12s",children:"@sudarshan12s"})," for support and guidance from ODPI-C (",(0,r.jsx)(i.a,{href:"https://github.com/oracle/odpi",children:"https://github.com/oracle/odpi"}),")."]}),"\n",(0,r.jsx)(i.p,{children:"In this release, we also continued some minor code refactoring."}),"\n",(0,r.jsx)(i.h3,{id:"version-153-january-28-2025",children:"Version 1.5.3, January 28, 2025"}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.em,{children:"Known issue"}),": This release has a known issue that results in the error message ",(0,r.jsx)(i.code,{children:"malloc(): unsorted double linked list corrupted"}),".\nWe recommend staying on 1.5.2 until a new release with a fix is available. We hope to have a fix by early March."]}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Fix over-zealous supression of errors when ",(0,r.jsx)(i.code,{children:"ignorezeroresult = true"})," (#168)."]}),"\n",(0,r.jsxs)(i.li,{children:["When ",(0,r.jsx)(i.code,{children:"scrapeinterval"})," is set, do first scrape immediately, not after the interval (#166)."]}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/redelang",children:"@redelang"})}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"In this release, we also started some minor code refactoring."}),"\n",(0,r.jsx)(i.h3,{id:"version-152-december-2-2024",children:"Version 1.5.2, December 2, 2024"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Update the metric defintion for tablespace usage to report more accurate temp space usage."}),"\n",(0,r.jsx)(i.li,{children:"Revert InstantClient to 21c version due to ADB connectivity issue."}),"\n",(0,r.jsx)(i.li,{children:"Update documentation to explain how to obtain credentials from a wallet."}),"\n",(0,r.jsx)(i.li,{children:"Fix race condition on err variable in scrape() func (by @valrusu)."}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/aureliocirella",children:"@aureliocirella"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/mitoeth",children:"@mitoeth"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/valrusu",children:"@valrusu"})}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-151-october-28-2024",children:"Version 1.5.1, October 28, 2024"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Added support for using the ",(0,r.jsx)(i.code,{children:"TNS_ADMIN"})," environment variable, which fixes an issue when connecting to Autonomous Database instances using TNS name."]}),"\n",(0,r.jsx)(i.li,{children:"Updated InstantClient to 23ai version for amd64 and latest available 19.24 version for arm64."}),"\n",(0,r.jsxs)(i.li,{children:["Fixed an issue with wrong ",(0,r.jsx)(i.code,{children:"LD_LIBRARY_PATH"})," on some platforms. (#136)"]}),"\n",(0,r.jsxs)(i.li,{children:["Added documentation and an example of using the ",(0,r.jsx)(i.code,{children:"scrapeinterval"})," setting to change the interval at which a certain metric is colected."]}),"\n",(0,r.jsx)(i.li,{children:"Added notes to documentation for extra security parameters needed when using a wallet with Podman."}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-150-september-26-2024",children:"Version 1.5.0, September 26, 2024"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Support for running the exporter on ARM processors (darwin and linux)."}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n",(0,r.jsx)(i.li,{children:'Updated the "test/demo environment" to use newer version of Oracle Database (23.5.0.24.07) and faster startup.'}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-140-september-4-2024",children:"Version 1.4.0, September 4, 2024"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Allow multiple custom metrics definition files."}),"\n",(0,r.jsx)(i.li,{children:"Allow query timeout per-metric."}),"\n",(0,r.jsx)(i.li,{children:"Allow scrape interval per-metric."}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-131-july-22-2024",children:"Version 1.3.1, July 22, 2024"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Alert logs can be disabled by setting parameter ",(0,r.jsx)(i.code,{children:"log.disable"})," to ",(0,r.jsx)(i.code,{children:"1"}),"."]}),"\n",(0,r.jsx)(i.li,{children:"Alert log exporter will stop if it gets three consecutive failures."}),"\n",(0,r.jsx)(i.li,{children:"Updated the list of required permissions."}),"\n",(0,r.jsx)(i.li,{children:"Updated the TxEventQ sample dashboard."}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/tux-jochen",children:"@tux-jochen"})}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-130-june-7-2024",children:"Version 1.3.0, June 7, 2024"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["Alert logs can be exported for collection by a log reader like Promtail or FluentBit. Default\noutput to ",(0,r.jsx)(i.code,{children:"/log/alert.log"})," in JSON format."]}),"\n",(0,r.jsx)(i.li,{children:"Provide ability to connect as SYSDBA or SYSOPER by setting DB_ROLE."}),"\n",(0,r.jsx)(i.li,{children:"New default metric is added to report the type of database connected to (CDB or PDB)."}),"\n",(0,r.jsx)(i.li,{children:"New default metrics are added for cache hit ratios."}),"\n",(0,r.jsx)(i.li,{children:"Default metrics updated to suppress spurious warnings in log."}),"\n",(0,r.jsx)(i.li,{children:"Wait class metric updated to use a better query."}),"\n",(0,r.jsx)(i.li,{children:"The sample dashboard is updated to include new metrics."}),"\n",(0,r.jsx)(i.li,{children:"Fixed a bug which prevented periodic freeing of memory."}),"\n",(0,r.jsx)(i.li,{children:"Set CLIENT_INFO to a meaningful value."}),"\n",(0,r.jsx)(i.li,{children:"Update Go toolchain to 1.22.4."}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/pioro",children:"@pioro"})}),"\n",(0,r.jsx)(i.li,{children:(0,r.jsx)(i.a,{href:"https://github.com/savoir81",children:"@savoir81"})}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-121-april-16-2024",children:"Version 1.2.1, April 16, 2024"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Accept max idle and open connections settings as parameters."}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-120-january-17-2024",children:"Version 1.2.0, January 17, 2024"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Introduced a new feature to periodically restart the process if requested."}),"\n",(0,r.jsx)(i.li,{children:"Introduced a new feature to periodically attempt to free OS memory if requested."}),"\n",(0,r.jsx)(i.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-111-november-28-2023",children:"Version 1.1.1, November 28, 2023"}),"\n",(0,r.jsx)(i.p,{children:"This release just updates some third-party dependencies."}),"\n",(0,r.jsx)(i.h3,{id:"version-11-october-27-2023",children:"Version 1.1, October 27, 2023"}),"\n",(0,r.jsx)(i.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["The query for the standard metric ",(0,r.jsx)(i.code,{children:"wait_class"})," has been updated so that it will work in both container databases\nand pluggable databases, including in Oracle Autonomous Database instances. Note that this query will not return\nany data unless the database instance is under load."]}),"\n",(0,r.jsxs)(i.li,{children:["Support for reading the database password from OCI Vault has been added (see ",(0,r.jsx)(i.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/oci-vault",children:"details"}),")"]}),"\n",(0,r.jsx)(i.li,{children:"Log messages have been improved"}),"\n",(0,r.jsx)(i.li,{children:"Some dependencies have been updated"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"version-10-september-13-2023",children:"Version 1.0, September 13, 2023"}),"\n",(0,r.jsx)(i.p,{children:"The first production release, v1.0, includes the following features:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["A number of ",(0,r.jsx)(i.a,{href:"/oracle-db-appdev-monitoring/docs/getting-started/default-metrics",children:"standard metrics"})," are exposed,"]}),"\n",(0,r.jsxs)(i.li,{children:["Users can define ",(0,r.jsx)(i.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics",children:"custom metrics"}),","]}),"\n",(0,r.jsx)(i.li,{children:"Oracle regularly reviews third-party licenses and scans the code and images, including transitive/recursive dependencies for issues,"}),"\n",(0,r.jsx)(i.li,{children:"Connection to Oracle can be a basic connection or use an Oracle Wallet and TLS - connection to Oracle Autonomous Database is supported,"}),"\n",(0,r.jsx)(i.li,{children:"Metrics for Oracle Transactional Event Queues are also supported,"}),"\n",(0,r.jsx)(i.li,{children:"A Grafana dashboard is provided for Transactional Event Queues, and"}),"\n",(0,r.jsx)(i.li,{children:"A pre-built container image is provided, based on Oracle Linux, and optimized for size and security."}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Note that this exporter uses a different Oracle Database driver which in turn uses code directly written by Oracle to access the database. This driver does require an Oracle client. In this initial release, the client is bundled into the container image, however we intend to make that optional in order to minimize the image size."}),"\n",(0,r.jsx)(i.p,{children:"The interfaces for this version have been kept as close as possible to those of earlier alpha releases in this repository to assist with migration. However, it should be expected that there may be breaking changes in future releases."})]})}function h(e={}){const{wrapper:i}={...(0,t.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>l,x:()=>o});var s=n(6540);const r={},t=s.createContext(r);function l(e){const i=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/23d97946.1e8fee4b.js b/docs/assets/js/23d97946.1e8fee4b.js new file mode 100644 index 00000000..8ee180a4 --- /dev/null +++ b/docs/assets/js/23d97946.1e8fee4b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6897],{8453:(e,a,t)=>{t.d(a,{R:()=>o,x:()=>i});var n=t(6540);const r={},s=n.createContext(r);function o(e){const a=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function i(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(s.Provider,{value:a},e.children)}},9466:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"configuration/hashicorp-vault","title":"HashiCorp Vault","description":"Securely load database credentials from HashiCorp Vault.","source":"@site/docs/configuration/hashicorp-vault.md","sourceDirName":"configuration","slug":"/configuration/hashicorp-vault","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/hashicorp-vault","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/configuration/hashicorp-vault.md","tags":[],"version":"current","sidebarPosition":8,"frontMatter":{"title":"HashiCorp Vault","sidebar_position":8},"sidebar":"tutorialSidebar","previous":{"title":"Azure Vault","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/azure-vault"},"next":{"title":"Advanced","permalink":"/oracle-db-appdev-monitoring/docs/next/category/advanced"}}');var r=t(4848),s=t(8453);const o={title:"HashiCorp Vault",sidebar_position:8},i="HashiCorp Vault",l={},c=[{value:"Dynamic database credentials",id:"dynamic-database-credentials",level:3},{value:"Authentication",id:"authentication",level:3}];function d(e){const a={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.header,{children:(0,r.jsx)(a.h1,{id:"hashicorp-vault",children:"HashiCorp Vault"})}),"\n",(0,r.jsx)(a.p,{children:"Securely load database credentials from HashiCorp Vault."}),"\n",(0,r.jsxs)(a.p,{children:["Each database in the config file may be configured to use HashiCorp Vault. To load the database username and/or password from HashiCorp Vault, set the ",(0,r.jsx)(a.code,{children:"vault.hashicorp"})," property to contain the following information:"]}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-yaml",children:'databases:\n mydb:\n vault:\n hashicorp:\n proxySocket: /var/run/vault/vault.sock\n mountType: "kvv1", "kvv2", "database" or "logical"\n mountName: secret engine mount path\n secretPath: path of the secret or database role name\n usernameAttribute: name of the JSON attribute, where to read the database username, if ommitted defaults to "username"\n passwordAttribute: name of the JSON attribute, where to read the database password, if ommitted defaults to "password"\n'})}),"\n",(0,r.jsx)(a.p,{children:"Example"}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n hashicorp:\n proxySocket: /var/run/vault/vault.sock\n mountType: kvv2\n mountName: dev\n secretPath: oracle/mydb/monitoring\n"})}),"\n",(0,r.jsx)(a.h3,{id:"dynamic-database-credentials",children:"Dynamic database credentials"}),"\n",(0,r.jsx)(a.p,{children:"Instead of fixed database credentials Vault also supports dynamic credentials that are created every time application requests them. This\nmakes sure the credentials always have a short time-to-live and even if they leak, they quickly become invalid."}),"\n",(0,r.jsxs)(a.p,{children:["Follow ",(0,r.jsx)(a.a,{href:"https://developer.hashicorp.com/vault/docs/secrets/databases/oracle",children:"Vault documentation on how to set up Oracle database plugin for Vault"}),"."]}),"\n",(0,r.jsx)(a.p,{children:"A few additional notes about connecting exporter to CDB. NB! Below are just example commands, adjust them to fit your environment."}),"\n",(0,r.jsx)(a.p,{children:'When setting up connection to CDB, then also need to edit "username_template" parameter, so Vault would create a C## common user for exporter.'}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-sh",children:'vault write database/config/mydb \\\n plugin_name=vault-plugin-database-oracle \\\n allowed_roles="mydb_exporter" \\\n connection_url=\'{{username}}/{{password}}@//172.17.0.3:1521/FREE\' \\\n username_template=\'{{ printf "C##V_%s_%s_%s_%s" (.DisplayName | truncate 8) (.RoleName | truncate 8) (random 20) (unix_time) | truncate 30 | uppercase | replace "-" "_" | replace "." "_" }}\' \\\n username=\'c##vaultadmin\' \\\n password=\'vaultadmin\'\n'})}),"\n",(0,r.jsx)(a.p,{children:"Since Vault is creating common users in CDB, it needs to have CREATE/ALTER/DROP USER privileges on all containers. Here is a modification of the documented Vault Oracle plugin admin user privileges."}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-sql",children:"GRANT CREATE USER to c##vaultadmin WITH ADMIN OPTION container=all;\nGRANT ALTER USER to c##vaultadmin WITH ADMIN OPTION container=all;\nGRANT DROP USER to c##vaultadmin WITH ADMIN OPTION container=all;\nGRANT CREATE SESSION to c##vaultadmin WITH ADMIN OPTION;\nGRANT SELECT on gv_$session to c##vaultadmin;\nGRANT SELECT on v_$sql to c##vaultadmin;\nGRANT ALTER SYSTEM to c##vaultadmin WITH ADMIN OPTION;\n"})}),"\n",(0,r.jsx)(a.p,{children:"Create no authentication user in Oracle database, that has actual monitoring privileges."}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-sql",children:"CREATE USER c##exporter NO AUTHENTICATION;\nGRANT create session TO c##exporter;\nGRANT all necessary privileges that Exporter needs TO c##exporter;\n"})}),"\n",(0,r.jsx)(a.p,{children:"Create database role in Vault:"}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-sh",children:'vault write database/roles/mydb_exporter \\\n db_name=mydb \\\n creation_statements=\'CREATE USER {{username}} IDENTIFIED BY "{{password}}"; GRANT CREATE SESSION TO {{username}}; ALTER USER c##exporter GRANT CONNECT THROUGH {{username}};\' \\\n default_ttl="7d" \\\n max_ttl="10d"\n'})}),"\n",(0,r.jsx)(a.p,{children:"NB! Make sure to restart Exporter before TTL above expires, this will fetch new database credentials. When TTL expires, Vault will drop the dynamically created database users."}),"\n",(0,r.jsx)(a.p,{children:"And create database config in Exporter:"}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n hashicorp:\n proxySocket: /var/run/vault/vault.sock\n mountType: database\n mountName: database\n secretPath: mydb_exporter\n useAsProxyFor: c##exporter\n"})}),"\n",(0,r.jsx)(a.h3,{id:"authentication",children:"Authentication"}),"\n",(0,r.jsx)(a.p,{children:"In this first version it currently only supports queries via HashiCorp Vault Proxy configured to run on the local host and listening on a Unix socket. Currently also required use_auto_auth_token option to be set.\nWill expand the support for other methods in the future."}),"\n",(0,r.jsx)(a.p,{children:"Example Vault Proxy configuration snippet:"}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{children:'listener "unix" {\n address = "/var/run/vault/vault.sock"\n socket_mode = "0660"\n socket_user = "vault"\n socket_group = "vaultaccess"\n tls_disable = true\n}\n\napi_proxy {\n # This always uses the auto_auth token when communicating with Vault server, even if client does not send a token\n use_auto_auth_token = true\n}\n'})})]})}function u(e={}){const{wrapper:a}={...(0,s.R)(),...e.components};return a?(0,r.jsx)(a,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/3af644fb.75cc0d37.js b/docs/assets/js/24c6a518.bc6cb009.js similarity index 98% rename from docs/assets/js/3af644fb.75cc0d37.js rename to docs/assets/js/24c6a518.bc6cb009.js index b3325e4b..129b2248 100644 --- a/docs/assets/js/3af644fb.75cc0d37.js +++ b/docs/assets/js/24c6a518.bc6cb009.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[9567],{2245:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"configuration/custom-metrics","title":"Custom Metrics","description":"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.","source":"@site/versioned_docs/version-2.1.0/configuration/custom-metrics.md","sourceDirName":"configuration","slug":"/configuration/custom-metrics","permalink":"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/custom-metrics.md","tags":[],"version":"2.1.0","sidebarPosition":2,"frontMatter":{"title":"Custom Metrics","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Exporter Configuration","permalink":"/oracle-db-appdev-monitoring/docs/configuration/config-file"},"next":{"title":"Multiple Databases","permalink":"/oracle-db-appdev-monitoring/docs/configuration/multiple-databases"}}');var r=i(4848),n=i(8453);const l={title:"Custom Metrics",sidebar_position:2},a="Custom Metrics",c={},o=[{value:"Metric Hot Reload",id:"metric-hot-reload",level:3},{value:"Metric Schema",id:"metric-schema",level:3},{value:"Example Metric Definition",id:"example-metric-definition",level:3},{value:"Override Existing, Individual Metrics",id:"override-existing-individual-metrics",level:4},{value:"YAML Metrics",id:"yaml-metrics",level:3},{value:"Customize metrics in a container image",id:"customize-metrics-in-a-container-image",level:3}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"custom-metrics",children:"Custom Metrics"})}),"\n",(0,r.jsx)(t.p,{children:"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files."}),"\n",(0,r.jsxs)(t.p,{children:["To specify custom metrics files\nexporter, use the ",(0,r.jsx)(t.code,{children:"metrics"})," configuration in the ",(0,r.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/config-file",children:"config file"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"metrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files (TOML or YAML)\n custom:\n - custom-metrics-example/custom-metrics.toml\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You may also use ",(0,r.jsx)(t.code,{children:"--custom.metrics"})," flag followed by a comma separated list of TOML or YAML files, or export ",(0,r.jsx)(t.code,{children:"CUSTOM_METRICS"})," variable environment (",(0,r.jsx)(t.code,{children:"export CUSTOM_METRICS=my-custom-metrics.toml,my-other-custom-metrics.toml"}),")"]}),"\n",(0,r.jsx)(t.h3,{id:"metric-hot-reload",children:"Metric Hot Reload"}),"\n",(0,r.jsx)(t.p,{children:"The exporter watches for changes in custom metrics. When these files change, the exporter hot reloads the metrics definition, and serves the new metrics on the next scrape."}),"\n",(0,r.jsx)(t.h3,{id:"metric-schema",children:"Metric Schema"}),"\n",(0,r.jsxs)(t.p,{children:["Metrics files must contain a series of ",(0,r.jsx)(t.code,{children:"[[metric]]"})," definitions, in TOML, or the equivalent definition in a YAML file. Each metric definition must follow the exporter's metric schema:"]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Field Name"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Required"}),(0,r.jsx)(t.th,{children:"Default"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"context"}),(0,r.jsx)(t.td,{children:"Metric context, used to build metric FQN"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"labels"}),(0,r.jsx)(t.td,{children:"Metric labels, which must match column names in the query. Any column that is not a label will be parsed as a metric"}),(0,r.jsx)(t.td,{children:"Array of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricsdesc"}),(0,r.jsx)(t.td,{children:"Mapping between field(s) in the request and comment(s)"}),(0,r.jsx)(t.td,{children:"Dictionary of Strings"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricstype"}),(0,r.jsxs)(t.td,{children:["Mapping between field(s) in the request and ",(0,r.jsx)(t.a,{href:"https://prometheus.io/docs/concepts/metric_types/",children:"Prometheus metric types"})]}),(0,r.jsx)(t.td,{children:"Dictionary of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricsbuckets"}),(0,r.jsxs)(t.td,{children:["Split ",(0,r.jsx)(t.a,{href:"https://prometheus.io/docs/concepts/metric_types/#histogram",children:"histogram"})," metric types into buckets based on value (",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/metric-histogram-example.toml",children:"example"}),")"]}),(0,r.jsx)(t.td,{children:"Dictionary of String dictionaries"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"fieldtoappend"}),(0,r.jsxs)(t.td,{children:["Field from the request to append to the metric FQN. This field will ",(0,r.jsx)(t.strong,{children:"not"})," be included in the metric labels."]}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"request"}),(0,r.jsx)(t.td,{children:"Oracle database query to run for metrics scraping"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignorezeroresult"}),(0,r.jsx)(t.td,{children:"Whether or not an error will be printed if the request does not return any results"}),(0,r.jsx)(t.td,{children:"Boolean"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"false"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"querytimeout"}),(0,r.jsx)(t.td,{children:"Oracle Database query timeout duration, e.g., 300ms, 0.5h"}),(0,r.jsx)(t.td,{children:"String duration"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Value of query.timeout in seconds"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"scrapeinterval"}),(0,r.jsx)(t.td,{children:"Custom metric scrape interval. If the metric was already scraped during the specified interval, a cached value is provided."}),(0,r.jsx)(t.td,{children:"String duration"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"databases"}),(0,r.jsxs)(t.td,{children:["Array of databases the metric will be scraped from, using the database name from the exporter config file. If not present, the metric is scraped from all databases. If the databases array is empty (",(0,r.jsx)(t.code,{children:"databases = []"}),") the metric will not be scraped, effectively being disabled."]}),(0,r.jsx)(t.td,{children:"Array of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"example-metric-definition",children:"Example Metric Definition"}),"\n",(0,r.jsx)(t.p,{children:"Here's a simple example of a metric definition:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "test"\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n'})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsxs)(t.p,{children:["NOTE: Do not add a semicolon (",(0,r.jsx)(t.code,{children:";"}),") at the end of the SQL queries."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"This file produce the following entries in the exporter:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"# HELP oracledb_test_value_1 Simple example returning always 1.\n# TYPE oracledb_test_value_1 gauge\noracledb_test_value_1 1\n# HELP oracledb_test_value_2 Same but returning always 2.\n# TYPE oracledb_test_value_2 gauge\noracledb_test_value_2 2\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can also provide labels using ",(0,r.jsx)(t.code,{children:"labels"})," field. Here's an example providing two metrics, with and without labels:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "context_no_label"\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n\n[[metric]]\ncontext = "context_with_labels"\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2, \'First label\' as label_1, \'Second label\' as label_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n'})}),"\n",(0,r.jsx)(t.p,{children:"This TOML file produces the following result:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:'# HELP oracledb_context_no_label_value_1 Simple example returning always 1.\n# TYPE oracledb_context_no_label_value_1 gauge\noracledb_context_no_label_value_1 1\n# HELP oracledb_context_no_label_value_2 Same but returning always 2.\n# TYPE oracledb_context_no_label_value_2 gauge\noracledb_context_no_label_value_2 2\n# HELP oracledb_context_with_labels_value_1 Simple example returning always 1.\n# TYPE oracledb_context_with_labels_value_1 gauge\noracledb_context_with_labels_value_1{label_1="First label",label_2="Second label"} 1\n# HELP oracledb_context_with_labels_value_2 Same but returning always 2.\n# TYPE oracledb_context_with_labels_value_2 gauge\noracledb_context_with_labels_value_2{label_1="First label",label_2="Second label"} 2\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Last, you can set metric type using ",(0,r.jsx)(t.strong,{children:"metricstype"})," field."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "context_with_labels"\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2, \'First label\' as label_1, \'Second label\' as label_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1 as counter.", value_2 = "Same but returning always 2 as gauge." }\n# Can be counter or gauge (default)\nmetricstype = { value_1 = "counter" }\n'})}),"\n",(0,r.jsx)(t.p,{children:"This TOML file will produce the following result:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"# HELP oracledb_test_value_1 Simple test example returning always 1 as counter.\n# TYPE oracledb_test_value_1 counter\noracledb_test_value_1 1\n# HELP oracledb_test_value_2 Same test but returning always 2 as gauge.\n# TYPE oracledb_test_value_2 gauge\noracledb_test_value_2 2\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can find ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/custom-metrics.toml",children:"working examples"})," of custom metrics for slow queries, big queries and top 100 tables.\nAn example of ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/txeventq-metrics.toml",children:"custom metrics for Transacational Event Queues"})," is also provided."]}),"\n",(0,r.jsx)(t.h4,{id:"override-existing-individual-metrics",children:"Override Existing, Individual Metrics"}),"\n",(0,r.jsxs)(t.p,{children:["You may override properties for existing metrics by supplying a new, custom metric definition with the same ",(0,r.jsx)(t.code,{children:"context"})," and ",(0,r.jsx)(t.code,{children:"metricsdesc"})," values. For example, if you have an existing metric like so:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "my_default_metric"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\n'})}),"\n",(0,r.jsxs)(t.p,{children:["You can redefine this metric in a custom metrics file to change any properties other than ",(0,r.jsx)(t.code,{children:"context"})," or ",(0,r.jsx)(t.code,{children:"metricsdesc"}),". For example, overriding the previous metric with ",(0,r.jsx)(t.code,{children:"labels"}),", ",(0,r.jsx)(t.code,{children:"scrapeinterval"}),", and ",(0,r.jsx)(t.code,{children:"querytimeout"})," properties:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "my_default_metric"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nscrapeinterval = "30s"\nquerytimeout = "10s"\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Then, provide any metrics overrides as custom metrics files in the ",(0,r.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/config-file",children:"exporter configuration file"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"metrics:\n ## Paths to any custom metrics files\n custom:\n - my-custom-metrics.toml\n"})}),"\n",(0,r.jsx)(t.p,{children:"If any metric appears more than once in the custom metrics file list, the metric definition in the last file provided takes precedence."}),"\n",(0,r.jsx)(t.h3,{id:"yaml-metrics",children:"YAML Metrics"}),"\n",(0,r.jsx)(t.p,{children:"Metrics may be defined with YAML instead of TOML. YAML metric field names correspond to TOML metric field names."}),"\n",(0,r.jsxs)(t.p,{children:["YAML metrics are defined as a list of ",(0,r.jsx)(t.code,{children:"metrics"})," objects:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:'metrics:\n - context: "sessions"\n labels: [ "inst_id", "status", "type" ]\n metricsdesc:\n value: "Gauge metric with count of sessions by inst_id, status and type."\n request: |\n select inst_id, status, type, count(*) as value\n from gv$session\n group by inst_id, status, type\n'})}),"\n",(0,r.jsxs)(t.p,{children:["The default metrics are provided in YAML format as an example. See ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/default-metrics.yaml",children:"default-metrics.yaml"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"customize-metrics-in-a-container-image",children:"Customize metrics in a container image"}),"\n",(0,r.jsxs)(t.p,{children:["If you run the exporter as a container image and want to include your custom metrics in the image itself, you can use the following example ",(0,r.jsx)(t.code,{children:"Dockerfile"})," to create a new image:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-Dockerfile",children:'FROM container-registry.oracle.com/database/observability-exporter:2.1.0\nCOPY custom-metrics.toml /\nENTRYPOINT ["/oracledb_exporter", "--custom.metrics", "/custom-metrics.toml"]\n'})})]})}function m(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>l,x:()=>a});var s=i(6540);const r={},n=s.createContext(r);function l(e){const t=s.useContext(n);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[1215],{1118:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"configuration/custom-metrics","title":"Custom Metrics","description":"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.","source":"@site/versioned_docs/version-2.2.0/configuration/custom-metrics.md","sourceDirName":"configuration","slug":"/configuration/custom-metrics","permalink":"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/configuration/custom-metrics.md","tags":[],"version":"2.2.0","sidebarPosition":2,"frontMatter":{"title":"Custom Metrics","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Exporter Configuration","permalink":"/oracle-db-appdev-monitoring/docs/configuration/config-file"},"next":{"title":"Multiple Databases","permalink":"/oracle-db-appdev-monitoring/docs/configuration/multiple-databases"}}');var r=i(4848),n=i(8453);const l={title:"Custom Metrics",sidebar_position:2},a="Custom Metrics",c={},o=[{value:"Metric Hot Reload",id:"metric-hot-reload",level:3},{value:"Metric Schema",id:"metric-schema",level:3},{value:"Example Metric Definition",id:"example-metric-definition",level:3},{value:"Override Existing, Individual Metrics",id:"override-existing-individual-metrics",level:4},{value:"YAML Metrics",id:"yaml-metrics",level:3},{value:"Customize metrics in a container image",id:"customize-metrics-in-a-container-image",level:3}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"custom-metrics",children:"Custom Metrics"})}),"\n",(0,r.jsx)(t.p,{children:"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files."}),"\n",(0,r.jsxs)(t.p,{children:["To specify custom metrics files\nexporter, use the ",(0,r.jsx)(t.code,{children:"metrics"})," configuration in the ",(0,r.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/config-file",children:"config file"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"metrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files (TOML or YAML)\n custom:\n - custom-metrics-example/custom-metrics.toml\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You may also use ",(0,r.jsx)(t.code,{children:"--custom.metrics"})," flag followed by a comma separated list of TOML or YAML files, or export ",(0,r.jsx)(t.code,{children:"CUSTOM_METRICS"})," variable environment (",(0,r.jsx)(t.code,{children:"export CUSTOM_METRICS=my-custom-metrics.toml,my-other-custom-metrics.toml"}),")"]}),"\n",(0,r.jsx)(t.h3,{id:"metric-hot-reload",children:"Metric Hot Reload"}),"\n",(0,r.jsx)(t.p,{children:"The exporter watches for changes in custom metrics. When these files change, the exporter hot reloads the metrics definition, and serves the new metrics on the next scrape."}),"\n",(0,r.jsx)(t.h3,{id:"metric-schema",children:"Metric Schema"}),"\n",(0,r.jsxs)(t.p,{children:["Metrics files must contain a series of ",(0,r.jsx)(t.code,{children:"[[metric]]"})," definitions, in TOML, or the equivalent definition in a YAML file. Each metric definition must follow the exporter's metric schema:"]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Field Name"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Required"}),(0,r.jsx)(t.th,{children:"Default"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"context"}),(0,r.jsx)(t.td,{children:"Metric context, used to build metric FQN"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"labels"}),(0,r.jsx)(t.td,{children:"Metric labels, which must match column names in the query. Any column that is not a label will be parsed as a metric"}),(0,r.jsx)(t.td,{children:"Array of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricsdesc"}),(0,r.jsx)(t.td,{children:"Mapping between field(s) in the request and comment(s)"}),(0,r.jsx)(t.td,{children:"Dictionary of Strings"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricstype"}),(0,r.jsxs)(t.td,{children:["Mapping between field(s) in the request and ",(0,r.jsx)(t.a,{href:"https://prometheus.io/docs/concepts/metric_types/",children:"Prometheus metric types"})]}),(0,r.jsx)(t.td,{children:"Dictionary of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricsbuckets"}),(0,r.jsxs)(t.td,{children:["Split ",(0,r.jsx)(t.a,{href:"https://prometheus.io/docs/concepts/metric_types/#histogram",children:"histogram"})," metric types into buckets based on value (",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/metric-histogram-example.toml",children:"example"}),")"]}),(0,r.jsx)(t.td,{children:"Dictionary of String dictionaries"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"fieldtoappend"}),(0,r.jsxs)(t.td,{children:["Field from the request to append to the metric FQN. This field will ",(0,r.jsx)(t.strong,{children:"not"})," be included in the metric labels."]}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"request"}),(0,r.jsx)(t.td,{children:"Oracle database query to run for metrics scraping"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignorezeroresult"}),(0,r.jsx)(t.td,{children:"Whether or not an error will be printed if the request does not return any results"}),(0,r.jsx)(t.td,{children:"Boolean"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"false"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"querytimeout"}),(0,r.jsx)(t.td,{children:"Oracle Database query timeout duration, e.g., 300ms, 0.5h"}),(0,r.jsx)(t.td,{children:"String duration"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Value of query.timeout in seconds"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"scrapeinterval"}),(0,r.jsx)(t.td,{children:"Custom metric scrape interval. If the metric was already scraped during the specified interval, a cached value is provided."}),(0,r.jsx)(t.td,{children:"String duration"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"databases"}),(0,r.jsxs)(t.td,{children:["Array of databases the metric will be scraped from, using the database name from the exporter config file. If not present, the metric is scraped from all databases. If the databases array is empty (",(0,r.jsx)(t.code,{children:"databases = []"}),") the metric will not be scraped, effectively being disabled."]}),(0,r.jsx)(t.td,{children:"Array of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"example-metric-definition",children:"Example Metric Definition"}),"\n",(0,r.jsx)(t.p,{children:"Here's a simple example of a metric definition:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "test"\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n'})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsxs)(t.p,{children:["NOTE: Do not add a semicolon (",(0,r.jsx)(t.code,{children:";"}),") at the end of the SQL queries."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"This file produce the following entries in the exporter:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"# HELP oracledb_test_value_1 Simple example returning always 1.\n# TYPE oracledb_test_value_1 gauge\noracledb_test_value_1 1\n# HELP oracledb_test_value_2 Same but returning always 2.\n# TYPE oracledb_test_value_2 gauge\noracledb_test_value_2 2\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can also provide labels using ",(0,r.jsx)(t.code,{children:"labels"})," field. Here's an example providing two metrics, with and without labels:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "context_no_label"\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n\n[[metric]]\ncontext = "context_with_labels"\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2, \'First label\' as label_1, \'Second label\' as label_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n'})}),"\n",(0,r.jsx)(t.p,{children:"This TOML file produces the following result:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:'# HELP oracledb_context_no_label_value_1 Simple example returning always 1.\n# TYPE oracledb_context_no_label_value_1 gauge\noracledb_context_no_label_value_1 1\n# HELP oracledb_context_no_label_value_2 Same but returning always 2.\n# TYPE oracledb_context_no_label_value_2 gauge\noracledb_context_no_label_value_2 2\n# HELP oracledb_context_with_labels_value_1 Simple example returning always 1.\n# TYPE oracledb_context_with_labels_value_1 gauge\noracledb_context_with_labels_value_1{label_1="First label",label_2="Second label"} 1\n# HELP oracledb_context_with_labels_value_2 Same but returning always 2.\n# TYPE oracledb_context_with_labels_value_2 gauge\noracledb_context_with_labels_value_2{label_1="First label",label_2="Second label"} 2\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Last, you can set metric type using ",(0,r.jsx)(t.strong,{children:"metricstype"})," field."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "context_with_labels"\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2, \'First label\' as label_1, \'Second label\' as label_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1 as counter.", value_2 = "Same but returning always 2 as gauge." }\n# Can be counter or gauge (default)\nmetricstype = { value_1 = "counter" }\n'})}),"\n",(0,r.jsx)(t.p,{children:"This TOML file will produce the following result:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"# HELP oracledb_test_value_1 Simple test example returning always 1 as counter.\n# TYPE oracledb_test_value_1 counter\noracledb_test_value_1 1\n# HELP oracledb_test_value_2 Same test but returning always 2 as gauge.\n# TYPE oracledb_test_value_2 gauge\noracledb_test_value_2 2\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can find ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/custom-metrics.toml",children:"working examples"})," of custom metrics for slow queries, big queries and top 100 tables.\nAn example of ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/txeventq-metrics.toml",children:"custom metrics for Transacational Event Queues"})," is also provided."]}),"\n",(0,r.jsx)(t.h4,{id:"override-existing-individual-metrics",children:"Override Existing, Individual Metrics"}),"\n",(0,r.jsxs)(t.p,{children:["You may override properties for existing metrics by supplying a new, custom metric definition with the same ",(0,r.jsx)(t.code,{children:"context"})," and ",(0,r.jsx)(t.code,{children:"metricsdesc"})," values. For example, if you have an existing metric like so:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "my_default_metric"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\n'})}),"\n",(0,r.jsxs)(t.p,{children:["You can redefine this metric in a custom metrics file to change any properties other than ",(0,r.jsx)(t.code,{children:"context"})," or ",(0,r.jsx)(t.code,{children:"metricsdesc"}),". For example, overriding the previous metric with ",(0,r.jsx)(t.code,{children:"labels"}),", ",(0,r.jsx)(t.code,{children:"scrapeinterval"}),", and ",(0,r.jsx)(t.code,{children:"querytimeout"})," properties:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "my_default_metric"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nscrapeinterval = "30s"\nquerytimeout = "10s"\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Then, provide any metrics overrides as custom metrics files in the ",(0,r.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/config-file",children:"exporter configuration file"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"metrics:\n ## Paths to any custom metrics files\n custom:\n - my-custom-metrics.toml\n"})}),"\n",(0,r.jsx)(t.p,{children:"If any metric appears more than once in the custom metrics file list, the metric definition in the last file provided takes precedence."}),"\n",(0,r.jsx)(t.h3,{id:"yaml-metrics",children:"YAML Metrics"}),"\n",(0,r.jsx)(t.p,{children:"Metrics may be defined with YAML instead of TOML. YAML metric field names correspond to TOML metric field names."}),"\n",(0,r.jsxs)(t.p,{children:["YAML metrics are defined as a list of ",(0,r.jsx)(t.code,{children:"metrics"})," objects:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:'metrics:\n - context: "sessions"\n labels: [ "inst_id", "status", "type" ]\n metricsdesc:\n value: "Gauge metric with count of sessions by inst_id, status and type."\n request: |\n select inst_id, status, type, count(*) as value\n from gv$session\n group by inst_id, status, type\n'})}),"\n",(0,r.jsxs)(t.p,{children:["The default metrics are provided in YAML format as an example. See ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/default-metrics.yaml",children:"default-metrics.yaml"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"customize-metrics-in-a-container-image",children:"Customize metrics in a container image"}),"\n",(0,r.jsxs)(t.p,{children:["If you run the exporter as a container image and want to include your custom metrics in the image itself, you can use the following example ",(0,r.jsx)(t.code,{children:"Dockerfile"})," to create a new image:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-Dockerfile",children:'FROM container-registry.oracle.com/database/observability-exporter:2.2.0\nCOPY custom-metrics.toml /\nENTRYPOINT ["/oracledb_exporter", "--custom.metrics", "/custom-metrics.toml"]\n'})})]})}function m(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>l,x:()=>a});var s=i(6540);const r={},n=s.createContext(r);function l(e){const t=s.useContext(n);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/2a1428c8.2106dfd2.js b/docs/assets/js/2a1428c8.1aedddc6.js similarity index 63% rename from docs/assets/js/2a1428c8.2106dfd2.js rename to docs/assets/js/2a1428c8.1aedddc6.js index 5a8139c9..f06cc6d2 100644 --- a/docs/assets/js/2a1428c8.2106dfd2.js +++ b/docs/assets/js/2a1428c8.1aedddc6.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[7504],{9132:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Releases","description":"Information on the exporter releases, changelog, and roadmap.","slug":"/category/releases","permalink":"/oracle-db-appdev-monitoring/docs/category/releases","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Compatibility with Older Database Versions","permalink":"/oracle-db-appdev-monitoring/docs/advanced/older-versions"},"next":{"title":"Roadmap","permalink":"/oracle-db-appdev-monitoring/docs/releases/roadmap"}}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[7504],{9132:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Releases","description":"Information on the exporter releases, changelog, and roadmap.","slug":"/category/releases","permalink":"/oracle-db-appdev-monitoring/docs/category/releases","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"go-ora Driver","permalink":"/oracle-db-appdev-monitoring/docs/advanced/go-ora"},"next":{"title":"Roadmap","permalink":"/oracle-db-appdev-monitoring/docs/releases/roadmap"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/2a3a3587.1b236897.js b/docs/assets/js/2a3a3587.1b236897.js new file mode 100644 index 00000000..a9ab33c5 --- /dev/null +++ b/docs/assets/js/2a3a3587.1b236897.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[295],{2356:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"advanced/go-runtime","title":"Configuring the Go Runtime","description":"If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter\'s usage of memory.","source":"@site/versioned_docs/version-2.1.0/advanced/go-runtime.md","sourceDirName":"advanced","slug":"/advanced/go-runtime","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/go-runtime","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/advanced/go-runtime.md","tags":[],"version":"2.1.0","sidebarPosition":1,"frontMatter":{"title":"Configuring the Go Runtime","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Advanced","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/advanced"},"next":{"title":"Monitoring TxEventQ","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/txeventq"}}');var r=n(4848),i=n(8453);const s={title:"Configuring the Go Runtime",sidebar_position:1},a="Exporter Go Runtime",d={},c=[];function l(e){const t={a:"a",code:"code",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"exporter-go-runtime",children:"Exporter Go Runtime"})}),"\n",(0,r.jsx)(t.p,{children:"If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter's usage of memory."}),"\n",(0,r.jsx)(t.p,{children:"Under normal circumstances, the exporter process will retain OS memory that was used by the Go garbage collector but is no longer needed, in case it may be needed again in the future, unless the host OS is under memory pressure. The result of this behavior (which is the normal behavior of the Go runtime) is that the resident set size will not decrease until the host OS memory is almost all used. Under most circumstances, this will not cause any issues, but if you are in an environment where you need to conserve memory, the following options are provided:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["You may set the ",(0,r.jsx)(t.code,{children:"FREE_INTERVAL"})," environment variable to a Go ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/maze.io/x/duration",children:"duration string"}),", e.g., ",(0,r.jsx)(t.code,{children:"60s"})," and run the exporter in debug mode by setting the ",(0,r.jsx)(t.code,{children:"GODEBUG"})," environment variable to a value including ",(0,r.jsx)(t.code,{children:"madvdontneed=1"}),", e.g., ",(0,r.jsx)(t.code,{children:"GODEBUG=gctrace=1,madvdontneed=1"}),". The exporter will call the ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/runtime/debug#FreeOSMemory",children:"FreeOSMemory()"})," at the specified interval. This tells the Go runtime to attempt to release memory which is no longer needed. Please note that this does not guarantee that the memory will be released to the OS, but over time you should see the RSS shrink sooner than without these settings."]}),"\n",(0,r.jsxs)(t.li,{children:["You may set the ",(0,r.jsx)(t.code,{children:"RESTART_INTERVAL"})," environment variable to a Go ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/maze.io/x/duration",children:"duration string"}),", e.g., ",(0,r.jsx)(t.code,{children:"10m"}),". The exporter will restart its own process at the specified iterval (by calling the OS ",(0,r.jsx)(t.code,{children:"exec"})," syscall). As no new process is created, the process identifier (PID) does not change, but the machine code, data, heap, and stack of the process are replaced by those of the new program (source: ",(0,r.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Exec_(system_call)",children:"Wikipedia"}),"). This has the side effect of freeing the resident set, so that it will return to its original size."]}),"\n",(0,r.jsxs)(t.li,{children:["In addition to these, you may also set ",(0,r.jsx)(t.code,{children:"GOMAXPROCS"}),", ",(0,r.jsx)(t.code,{children:"GOGC"}),", and ",(0,r.jsx)(t.code,{children:"GOMEMLIMIT"})," (see ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/runtime#hdr-Environment_Variables",children:"documentation"}),") to further limit the amount of resources that the Go runtime may use."]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var o=n(6540);const r={},i=o.createContext(r);function s(e){const t=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/2a3a3587.a3a85e02.js b/docs/assets/js/2a3a3587.a3a85e02.js deleted file mode 100644 index b2faeefa..00000000 --- a/docs/assets/js/2a3a3587.a3a85e02.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[295],{2356:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"advanced/go-runtime","title":"Configuring the Go Runtime","description":"If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter\'s usage of memory.","source":"@site/versioned_docs/version-2.1.0/advanced/go-runtime.md","sourceDirName":"advanced","slug":"/advanced/go-runtime","permalink":"/oracle-db-appdev-monitoring/docs/advanced/go-runtime","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/advanced/go-runtime.md","tags":[],"version":"2.1.0","sidebarPosition":1,"frontMatter":{"title":"Configuring the Go Runtime","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Advanced","permalink":"/oracle-db-appdev-monitoring/docs/category/advanced"},"next":{"title":"Monitoring TxEventQ","permalink":"/oracle-db-appdev-monitoring/docs/advanced/txeventq"}}');var r=n(4848),i=n(8453);const s={title:"Configuring the Go Runtime",sidebar_position:1},a="Exporter Go Runtime",d={},c=[];function l(e){const t={a:"a",code:"code",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"exporter-go-runtime",children:"Exporter Go Runtime"})}),"\n",(0,r.jsx)(t.p,{children:"If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter's usage of memory."}),"\n",(0,r.jsx)(t.p,{children:"Under normal circumstances, the exporter process will retain OS memory that was used by the Go garbage collector but is no longer needed, in case it may be needed again in the future, unless the host OS is under memory pressure. The result of this behavior (which is the normal behavior of the Go runtime) is that the resident set size will not decrease until the host OS memory is almost all used. Under most circumstances, this will not cause any issues, but if you are in an environment where you need to conserve memory, the following options are provided:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["You may set the ",(0,r.jsx)(t.code,{children:"FREE_INTERVAL"})," environment variable to a Go ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/maze.io/x/duration",children:"duration string"}),", e.g., ",(0,r.jsx)(t.code,{children:"60s"})," and run the exporter in debug mode by setting the ",(0,r.jsx)(t.code,{children:"GODEBUG"})," environment variable to a value including ",(0,r.jsx)(t.code,{children:"madvdontneed=1"}),", e.g., ",(0,r.jsx)(t.code,{children:"GODEBUG=gctrace=1,madvdontneed=1"}),". The exporter will call the ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/runtime/debug#FreeOSMemory",children:"FreeOSMemory()"})," at the specified interval. This tells the Go runtime to attempt to release memory which is no longer needed. Please note that this does not guarantee that the memory will be released to the OS, but over time you should see the RSS shrink sooner than without these settings."]}),"\n",(0,r.jsxs)(t.li,{children:["You may set the ",(0,r.jsx)(t.code,{children:"RESTART_INTERVAL"})," environment variable to a Go ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/maze.io/x/duration",children:"duration string"}),", e.g., ",(0,r.jsx)(t.code,{children:"10m"}),". The exporter will restart its own process at the specified iterval (by calling the OS ",(0,r.jsx)(t.code,{children:"exec"})," syscall). As no new process is created, the process identifier (PID) does not change, but the machine code, data, heap, and stack of the process are replaced by those of the new program (source: ",(0,r.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Exec_(system_call)",children:"Wikipedia"}),"). This has the side effect of freeing the resident set, so that it will return to its original size."]}),"\n",(0,r.jsxs)(t.li,{children:["In addition to these, you may also set ",(0,r.jsx)(t.code,{children:"GOMAXPROCS"}),", ",(0,r.jsx)(t.code,{children:"GOGC"}),", and ",(0,r.jsx)(t.code,{children:"GOMEMLIMIT"})," (see ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/runtime#hdr-Environment_Variables",children:"documentation"}),") to further limit the amount of resources that the Go runtime may use."]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var o=n(6540);const r={},i=o.createContext(r);function s(e){const t=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/2ebe357a.3b89631c.js b/docs/assets/js/2ebe357a.3b89631c.js deleted file mode 100644 index 3a6fb798..00000000 --- a/docs/assets/js/2ebe357a.3b89631c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[9419],{6689:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"releases/roadmap","title":"Roadmap","description":"Planned and upcoming features for the exporter.","source":"@site/versioned_docs/version-2.1.0/releases/roadmap.md","sourceDirName":"releases","slug":"/releases/roadmap","permalink":"/oracle-db-appdev-monitoring/docs/releases/roadmap","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/releases/roadmap.md","tags":[],"version":"2.1.0","sidebarPosition":1,"frontMatter":{"title":"Roadmap","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Releases","permalink":"/oracle-db-appdev-monitoring/docs/category/releases"},"next":{"title":"Changelog","permalink":"/oracle-db-appdev-monitoring/docs/releases/changelog"}}');var a=n(4848),o=n(8453);const i={title:"Roadmap",sidebar_position:1},s="Exporter Roadmap",l={},d=[];function c(e){const t={h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"exporter-roadmap",children:"Exporter Roadmap"})}),"\n",(0,a.jsx)(t.p,{children:"Planned and upcoming features for the exporter."}),"\n",(0,a.jsx)(t.p,{children:"We welcome input on community-driven features you'd like to see supported. Please open an issue in this repository with your suggestions."}),"\n",(0,a.jsx)(t.p,{children:"Currently, we plan to address the following key features:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Provide default Oracle Exadata metrics"}),"\n",(0,a.jsx)(t.li,{children:"Provide default GoldenGate metrics"}),"\n",(0,a.jsx)(t.li,{children:"Enhance database alert logging and alert log metrics"}),"\n",(0,a.jsx)(t.li,{children:"Provide the option to have the Oracle client outside of the container image, e.g., on a shared volume,"}),"\n",(0,a.jsx)(t.li,{children:"Implement the ability to update the configuration dynamically, i.e., without a restart"}),"\n",(0,a.jsx)(t.li,{children:"Implement support for tracing within the database, e.g., using an execution context ID provide by an external caller"}),"\n",(0,a.jsx)(t.li,{children:"Provide additional pre-built Grafana dashboards,"}),"\n",(0,a.jsx)(t.li,{children:"Integration with Spring Observability, e.g., Micrometer"}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>s});var r=n(6540);const a={},o=r.createContext(a);function i(e){const t=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/2ebe357a.a32c1390.js b/docs/assets/js/2ebe357a.a32c1390.js new file mode 100644 index 00000000..930a48e5 --- /dev/null +++ b/docs/assets/js/2ebe357a.a32c1390.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[9419],{6689:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"releases/roadmap","title":"Roadmap","description":"Planned and upcoming features for the exporter.","source":"@site/versioned_docs/version-2.1.0/releases/roadmap.md","sourceDirName":"releases","slug":"/releases/roadmap","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/releases/roadmap","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/releases/roadmap.md","tags":[],"version":"2.1.0","sidebarPosition":1,"frontMatter":{"title":"Roadmap","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Releases","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/releases"},"next":{"title":"Changelog","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/releases/changelog"}}');var a=n(4848),o=n(8453);const i={title:"Roadmap",sidebar_position:1},s="Exporter Roadmap",l={},d=[];function c(e){const t={h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"exporter-roadmap",children:"Exporter Roadmap"})}),"\n",(0,a.jsx)(t.p,{children:"Planned and upcoming features for the exporter."}),"\n",(0,a.jsx)(t.p,{children:"We welcome input on community-driven features you'd like to see supported. Please open an issue in this repository with your suggestions."}),"\n",(0,a.jsx)(t.p,{children:"Currently, we plan to address the following key features:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Provide default Oracle Exadata metrics"}),"\n",(0,a.jsx)(t.li,{children:"Provide default GoldenGate metrics"}),"\n",(0,a.jsx)(t.li,{children:"Enhance database alert logging and alert log metrics"}),"\n",(0,a.jsx)(t.li,{children:"Provide the option to have the Oracle client outside of the container image, e.g., on a shared volume,"}),"\n",(0,a.jsx)(t.li,{children:"Implement the ability to update the configuration dynamically, i.e., without a restart"}),"\n",(0,a.jsx)(t.li,{children:"Implement support for tracing within the database, e.g., using an execution context ID provide by an external caller"}),"\n",(0,a.jsx)(t.li,{children:"Provide additional pre-built Grafana dashboards,"}),"\n",(0,a.jsx)(t.li,{children:"Integration with Spring Observability, e.g., Micrometer"}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>s});var r=n(6540);const a={},o=r.createContext(a);function i(e){const t=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/30c2683d.126a72c2.js b/docs/assets/js/30c2683d.126a72c2.js deleted file mode 100644 index bce4f157..00000000 --- a/docs/assets/js/30c2683d.126a72c2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[2050],{3672:(e,t,r)=>{r.d(t,{A:()=>a});const a=r.p+"assets/images/exporter-running-against-basedb-8d8d9efd9a0bec0eb44e25f40e1cced0.png"},8453:(e,t,r)=>{r.d(t,{R:()=>o,x:()=>i});var a=r(6540);const n={},s=a.createContext(n);function o(e){const t=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),a.createElement(s.Provider,{value:t},e.children)}},9916:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"intro","title":"OpenTelemetry Metrics for Oracle Database","description":"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.","source":"@site/versioned_docs/version-2.1.0/intro.md","sourceDirName":".","slug":"/intro","permalink":"/oracle-db-appdev-monitoring/docs/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/intro.md","tags":[],"version":"2.1.0","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Getting Started","permalink":"/oracle-db-appdev-monitoring/docs/category/getting-started"}}');var n=r(4848),s=r(8453);const o={sidebar_position:1},i="OpenTelemetry Metrics for Oracle Database",c={},l=[{value:"Main Features",id:"main-features",level:2},{value:"Supported Oracle Database Versions",id:"supported-oracle-database-versions",level:2},{value:"Acknowledgements",id:"acknowledgements",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"opentelemetry-metrics-for-oracle-database",children:"OpenTelemetry Metrics for Oracle Database"})}),"\n",(0,n.jsx)(t.p,{children:"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere."}),"\n",(0,n.jsx)(t.p,{children:"The metrics supports monitoring multiple database instances, querying default and custom metrics, and ensures that if one database goes offline for maintenance, the rest stay monitored."}),"\n",(0,n.jsx)(t.p,{children:"Over time, this project will provide not just metrics, but also logging and tracing support, and integration into popular frameworks like Spring Boot. The project aims to deliver functionality to support both cloud and on-premises databases, including those running in Kubernetes and containers."}),"\n",(0,n.jsxs)(t.p,{children:["Contributions are welcome - please see ",(0,n.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/CONTRIBUTING.md",children:"contributing"}),"."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Oracle Database Dashboard",src:r(3672).A+"",width:"1256",height:"1460"})}),"\n",(0,n.jsx)(t.h2,{id:"main-features",children:"Main Features"}),"\n",(0,n.jsx)(t.p,{children:"The exporter supports the following main features"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Exports Oracle Database metrics in standard OTEL/Prometheus format"}),"\n",(0,n.jsx)(t.li,{children:"Works with on-prem, in the cloud, and in Kubernetes, with single instance, clustered, or Autonomous Oracle Database instances"}),"\n",(0,n.jsx)(t.li,{children:"Authenticate with plaintext, TLS, and Oracle Wallet"}),"\n",(0,n.jsx)(t.li,{children:"Secure credentials with Oracle Cloud Infrastructure (OCI) Vault or Azure Vault"}),"\n",(0,n.jsx)(t.li,{children:"Load metrics from one or more databases using a single exporter instance"}),"\n",(0,n.jsx)(t.li,{children:"Export the Prometheus Alert Log in JSON format for easy ingest by log aggregators"}),"\n",(0,n.jsx)(t.li,{children:"Pre-buit AMD64 and ARM64 images provided"}),"\n",(0,n.jsx)(t.li,{children:'Standard, default metrics included "out of the box"'}),"\n",(0,n.jsx)(t.li,{children:"Easily define custom metrics using YAML or TOML"}),"\n",(0,n.jsx)(t.li,{children:"Define the scrape interval, database query timeout, and other parameters on a per-metric, per-database level"}),"\n",(0,n.jsx)(t.li,{children:"Customize the database connection pool using go-sql, Oracle Database connection pools, and works with Database Resident Connection Pools"}),"\n",(0,n.jsxs)(t.li,{children:["Includes a sample ",(0,n.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/docker-compose/grafana",children:"Grafana dashboards"})," for inspiration or customization"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"supported-oracle-database-versions",children:"Supported Oracle Database Versions"}),"\n",(0,n.jsx)(t.p,{children:"The Oracle Database Metrics Exporter natively supports Oracle Database versions 19c and 23ai."}),"\n",(0,n.jsx)(t.h2,{id:"acknowledgements",children:"Acknowledgements"}),"\n",(0,n.jsxs)(t.p,{children:["From the v1.0 release onwards, this project provides a ",(0,n.jsx)(t.a,{href:"https://prometheus.io/",children:"Prometheus"})," exporter for Oracle Database based in part on a Prometheus exporter created by ",(0,n.jsx)(t.a,{href:"https://github.com/iamseth/oracledb_exporter",children:"Seth Miller"}),". This project includes changes to comply with various Oracle standards and policies, as well as new features."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:'Seth has archived his exporter as of Feb 13, 2025 and added a note encouraging people to check out ours instead. We wanted to extend a huge "Thank You!" to Seth for the work he did on that exporter, and his contributions to the Oracle and open source communities!'}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/30c2683d.985171e5.js b/docs/assets/js/30c2683d.985171e5.js new file mode 100644 index 00000000..ae07e626 --- /dev/null +++ b/docs/assets/js/30c2683d.985171e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[2050],{3672:(e,t,r)=>{r.d(t,{A:()=>a});const a=r.p+"assets/images/exporter-running-against-basedb-8d8d9efd9a0bec0eb44e25f40e1cced0.png"},8453:(e,t,r)=>{r.d(t,{R:()=>o,x:()=>i});var a=r(6540);const n={},s=a.createContext(n);function o(e){const t=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),a.createElement(s.Provider,{value:t},e.children)}},9916:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"intro","title":"OpenTelemetry Metrics for Oracle Database","description":"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.","source":"@site/versioned_docs/version-2.1.0/intro.md","sourceDirName":".","slug":"/intro","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/intro.md","tags":[],"version":"2.1.0","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Getting Started","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/getting-started"}}');var n=r(4848),s=r(8453);const o={sidebar_position:1},i="OpenTelemetry Metrics for Oracle Database",c={},l=[{value:"Main Features",id:"main-features",level:2},{value:"Supported Oracle Database Versions",id:"supported-oracle-database-versions",level:2},{value:"Acknowledgements",id:"acknowledgements",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"opentelemetry-metrics-for-oracle-database",children:"OpenTelemetry Metrics for Oracle Database"})}),"\n",(0,n.jsx)(t.p,{children:"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere."}),"\n",(0,n.jsx)(t.p,{children:"The metrics supports monitoring multiple database instances, querying default and custom metrics, and ensures that if one database goes offline for maintenance, the rest stay monitored."}),"\n",(0,n.jsx)(t.p,{children:"Over time, this project will provide not just metrics, but also logging and tracing support, and integration into popular frameworks like Spring Boot. The project aims to deliver functionality to support both cloud and on-premises databases, including those running in Kubernetes and containers."}),"\n",(0,n.jsxs)(t.p,{children:["Contributions are welcome - please see ",(0,n.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/CONTRIBUTING.md",children:"contributing"}),"."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Oracle Database Dashboard",src:r(3672).A+"",width:"1256",height:"1460"})}),"\n",(0,n.jsx)(t.h2,{id:"main-features",children:"Main Features"}),"\n",(0,n.jsx)(t.p,{children:"The exporter supports the following main features"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Exports Oracle Database metrics in standard OTEL/Prometheus format"}),"\n",(0,n.jsx)(t.li,{children:"Works with on-prem, in the cloud, and in Kubernetes, with single instance, clustered, or Autonomous Oracle Database instances"}),"\n",(0,n.jsx)(t.li,{children:"Authenticate with plaintext, TLS, and Oracle Wallet"}),"\n",(0,n.jsx)(t.li,{children:"Secure credentials with Oracle Cloud Infrastructure (OCI) Vault or Azure Vault"}),"\n",(0,n.jsx)(t.li,{children:"Load metrics from one or more databases using a single exporter instance"}),"\n",(0,n.jsx)(t.li,{children:"Export the Prometheus Alert Log in JSON format for easy ingest by log aggregators"}),"\n",(0,n.jsx)(t.li,{children:"Pre-buit AMD64 and ARM64 images provided"}),"\n",(0,n.jsx)(t.li,{children:'Standard, default metrics included "out of the box"'}),"\n",(0,n.jsx)(t.li,{children:"Easily define custom metrics using YAML or TOML"}),"\n",(0,n.jsx)(t.li,{children:"Define the scrape interval, database query timeout, and other parameters on a per-metric, per-database level"}),"\n",(0,n.jsx)(t.li,{children:"Customize the database connection pool using go-sql, Oracle Database connection pools, and works with Database Resident Connection Pools"}),"\n",(0,n.jsxs)(t.li,{children:["Includes a sample ",(0,n.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/docker-compose/grafana",children:"Grafana dashboards"})," for inspiration or customization"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"supported-oracle-database-versions",children:"Supported Oracle Database Versions"}),"\n",(0,n.jsx)(t.p,{children:"The Oracle Database Metrics Exporter natively supports Oracle Database versions 19c and 23ai."}),"\n",(0,n.jsx)(t.h2,{id:"acknowledgements",children:"Acknowledgements"}),"\n",(0,n.jsxs)(t.p,{children:["From the v1.0 release onwards, this project provides a ",(0,n.jsx)(t.a,{href:"https://prometheus.io/",children:"Prometheus"})," exporter for Oracle Database based in part on a Prometheus exporter created by ",(0,n.jsx)(t.a,{href:"https://github.com/iamseth/oracledb_exporter",children:"Seth Miller"}),". This project includes changes to comply with various Oracle standards and policies, as well as new features."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:'Seth has archived his exporter as of Feb 13, 2025 and added a note encouraging people to check out ours instead. We wanted to extend a huge "Thank You!" to Seth for the work he did on that exporter, and his contributions to the Oracle and open source communities!'}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/d0f03a26.2b6c3a49.js b/docs/assets/js/395b46b3.1af476c9.js similarity index 95% rename from docs/assets/js/d0f03a26.2b6c3a49.js rename to docs/assets/js/395b46b3.1af476c9.js index 956f69be..f4fdbaa0 100644 --- a/docs/assets/js/d0f03a26.2b6c3a49.js +++ b/docs/assets/js/395b46b3.1af476c9.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[7889],{2475:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"advanced/development","title":"Development","description":"The exporter is a Go program using the Prometheus SDK.","source":"@site/versioned_docs/version-2.1.0/advanced/development.md","sourceDirName":"advanced","slug":"/advanced/development","permalink":"/oracle-db-appdev-monitoring/docs/advanced/development","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/advanced/development.md","tags":[],"version":"2.1.0","sidebarPosition":3,"frontMatter":{"title":"Development","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Monitoring TxEventQ","permalink":"/oracle-db-appdev-monitoring/docs/advanced/txeventq"},"next":{"title":"Compatibility with Older Database Versions","permalink":"/oracle-db-appdev-monitoring/docs/advanced/older-versions"}}');var t=i(4848),o=i(8453);const s={title:"Development",sidebar_position:3},a="Development",c={},l=[{value:"Docker/container build",id:"dockercontainer-build",level:3},{value:"Building Binaries",id:"building-binaries",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,t.jsx)(n.p,{children:"The exporter is a Go program using the Prometheus SDK."}),"\n",(0,t.jsxs)(n.p,{children:["External contributions are welcome, see ",(0,t.jsx)(n.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/CONTRIBUTING.md",children:"CONTRIBUTING"})," for details."]}),"\n",(0,t.jsx)(n.p,{children:"The exporter initialization is as follows:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Parse flags options and configuration properties"}),"\n",(0,t.jsxs)(n.li,{children:["Load the default toml file (",(0,t.jsx)(n.code,{children:"default-metrics.toml"}),") and store each metric in a ",(0,t.jsx)(n.code,{children:"Metric"})," struct"]}),"\n",(0,t.jsx)(n.li,{children:"Load the custom toml file (if a custom toml file is given)"}),"\n",(0,t.jsxs)(n.li,{children:["Create an ",(0,t.jsx)(n.code,{children:"Exporter"})," object"]}),"\n",(0,t.jsx)(n.li,{children:"Register exporter in prometheus library"}),"\n",(0,t.jsx)(n.li,{children:"Launching a web server to handle incoming requests"}),"\n",(0,t.jsx)(n.li,{children:"Attempt connection to any configured Oracle Database servers"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["These operations are mainly done in the ",(0,t.jsx)(n.code,{children:"main"})," function."]}),"\n",(0,t.jsx)(n.p,{children:"After this initialization phase, the exporter will wait for the arrival of a request."}),"\n",(0,t.jsxs)(n.p,{children:["Each time, it will iterate over the content of the ",(0,t.jsx)(n.code,{children:"metricsToScrape"})," structure (in the function scrape ",(0,t.jsx)(n.code,{children:"func (e * Export) scrape (ch chan <- prometheus.Metric)"}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["For each element (of ",(0,t.jsx)(n.code,{children:"Metric"})," type), a call to the ",(0,t.jsx)(n.code,{children:"ScrapeMetric"})," function will be made which will itself make a call to the ",(0,t.jsx)(n.code,{children:"ScrapeGenericValues"})," function."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"ScrapeGenericValues"})," function will read the information from the ",(0,t.jsx)(n.code,{children:"Metric"})," structure and, depending on the parameters, will generate the metrics to return. In particular, it will use the ",(0,t.jsx)(n.code,{children:"GeneratePrometheusMetrics"})," function which will make SQL calls to the database."]}),"\n",(0,t.jsx)(n.h3,{id:"dockercontainer-build",children:"Docker/container build"}),"\n",(0,t.jsx)(n.p,{children:"To build a container image, run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"make docker\n"})}),"\n",(0,t.jsx)(n.p,{children:"For ARM:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"make docker-arm\n"})}),"\n",(0,t.jsx)(n.h3,{id:"building-binaries",children:"Building Binaries"}),"\n",(0,t.jsx)(n.p,{children:"Run build:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"make go-build\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This will create binaries and archives inside the ",(0,t.jsx)(n.code,{children:"dist"})," folder for the building operating system."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>a});var r=i(6540);const t={},o=r.createContext(t);function s(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[2201],{6397:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"advanced/development","title":"Development","description":"The exporter is a Go program using the Prometheus SDK.","source":"@site/versioned_docs/version-2.2.0/advanced/development.md","sourceDirName":"advanced","slug":"/advanced/development","permalink":"/oracle-db-appdev-monitoring/docs/advanced/development","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/advanced/development.md","tags":[],"version":"2.2.0","sidebarPosition":3,"frontMatter":{"title":"Development","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Monitoring TxEventQ","permalink":"/oracle-db-appdev-monitoring/docs/advanced/txeventq"},"next":{"title":"Compatibility with Older Database Versions","permalink":"/oracle-db-appdev-monitoring/docs/advanced/older-versions"}}');var t=i(4848),o=i(8453);const s={title:"Development",sidebar_position:3},a="Development",c={},l=[{value:"Docker/container build",id:"dockercontainer-build",level:3},{value:"Building Binaries",id:"building-binaries",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,t.jsx)(n.p,{children:"The exporter is a Go program using the Prometheus SDK."}),"\n",(0,t.jsxs)(n.p,{children:["External contributions are welcome, see ",(0,t.jsx)(n.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/CONTRIBUTING.md",children:"CONTRIBUTING"})," for details."]}),"\n",(0,t.jsx)(n.p,{children:"The exporter initialization is as follows:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Parse flags options and configuration properties"}),"\n",(0,t.jsxs)(n.li,{children:["Load the default toml file (",(0,t.jsx)(n.code,{children:"default-metrics.toml"}),") and store each metric in a ",(0,t.jsx)(n.code,{children:"Metric"})," struct"]}),"\n",(0,t.jsx)(n.li,{children:"Load the custom toml file (if a custom toml file is given)"}),"\n",(0,t.jsxs)(n.li,{children:["Create an ",(0,t.jsx)(n.code,{children:"Exporter"})," object"]}),"\n",(0,t.jsx)(n.li,{children:"Register exporter in prometheus library"}),"\n",(0,t.jsx)(n.li,{children:"Launching a web server to handle incoming requests"}),"\n",(0,t.jsx)(n.li,{children:"Attempt connection to any configured Oracle Database servers"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["These operations are mainly done in the ",(0,t.jsx)(n.code,{children:"main"})," function."]}),"\n",(0,t.jsx)(n.p,{children:"After this initialization phase, the exporter will wait for the arrival of a request."}),"\n",(0,t.jsxs)(n.p,{children:["Each time, it will iterate over the content of the ",(0,t.jsx)(n.code,{children:"metricsToScrape"})," structure (in the function scrape ",(0,t.jsx)(n.code,{children:"func (e * Export) scrape (ch chan <- prometheus.Metric)"}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["For each element (of ",(0,t.jsx)(n.code,{children:"Metric"})," type), a call to the ",(0,t.jsx)(n.code,{children:"ScrapeMetric"})," function will be made which will itself make a call to the ",(0,t.jsx)(n.code,{children:"ScrapeGenericValues"})," function."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"ScrapeGenericValues"})," function will read the information from the ",(0,t.jsx)(n.code,{children:"Metric"})," structure and, depending on the parameters, will generate the metrics to return. In particular, it will use the ",(0,t.jsx)(n.code,{children:"GeneratePrometheusMetrics"})," function which will make SQL calls to the database."]}),"\n",(0,t.jsx)(n.h3,{id:"dockercontainer-build",children:"Docker/container build"}),"\n",(0,t.jsx)(n.p,{children:"To build a container image, run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"make docker\n"})}),"\n",(0,t.jsx)(n.p,{children:"For ARM:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"make docker-arm\n"})}),"\n",(0,t.jsx)(n.h3,{id:"building-binaries",children:"Building Binaries"}),"\n",(0,t.jsx)(n.p,{children:"Run build:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"make go-build\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This will create binaries and archives inside the ",(0,t.jsx)(n.code,{children:"dist"})," folder for the building operating system."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>a});var r=i(6540);const t={},o=r.createContext(t);function s(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/3af644fb.b5ca5e77.js b/docs/assets/js/3af644fb.b5ca5e77.js new file mode 100644 index 00000000..67ecd95a --- /dev/null +++ b/docs/assets/js/3af644fb.b5ca5e77.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[9567],{2245:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"configuration/custom-metrics","title":"Custom Metrics","description":"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.","source":"@site/versioned_docs/version-2.1.0/configuration/custom-metrics.md","sourceDirName":"configuration","slug":"/configuration/custom-metrics","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/custom-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/custom-metrics.md","tags":[],"version":"2.1.0","sidebarPosition":2,"frontMatter":{"title":"Custom Metrics","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Exporter Configuration","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/config-file"},"next":{"title":"Multiple Databases","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/multiple-databases"}}');var r=i(4848),n=i(8453);const l={title:"Custom Metrics",sidebar_position:2},a="Custom Metrics",c={},o=[{value:"Metric Hot Reload",id:"metric-hot-reload",level:3},{value:"Metric Schema",id:"metric-schema",level:3},{value:"Example Metric Definition",id:"example-metric-definition",level:3},{value:"Override Existing, Individual Metrics",id:"override-existing-individual-metrics",level:4},{value:"YAML Metrics",id:"yaml-metrics",level:3},{value:"Customize metrics in a container image",id:"customize-metrics-in-a-container-image",level:3}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"custom-metrics",children:"Custom Metrics"})}),"\n",(0,r.jsx)(t.p,{children:"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files."}),"\n",(0,r.jsxs)(t.p,{children:["To specify custom metrics files\nexporter, use the ",(0,r.jsx)(t.code,{children:"metrics"})," configuration in the ",(0,r.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/config-file",children:"config file"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"metrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files (TOML or YAML)\n custom:\n - custom-metrics-example/custom-metrics.toml\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You may also use ",(0,r.jsx)(t.code,{children:"--custom.metrics"})," flag followed by a comma separated list of TOML or YAML files, or export ",(0,r.jsx)(t.code,{children:"CUSTOM_METRICS"})," variable environment (",(0,r.jsx)(t.code,{children:"export CUSTOM_METRICS=my-custom-metrics.toml,my-other-custom-metrics.toml"}),")"]}),"\n",(0,r.jsx)(t.h3,{id:"metric-hot-reload",children:"Metric Hot Reload"}),"\n",(0,r.jsx)(t.p,{children:"The exporter watches for changes in custom metrics. When these files change, the exporter hot reloads the metrics definition, and serves the new metrics on the next scrape."}),"\n",(0,r.jsx)(t.h3,{id:"metric-schema",children:"Metric Schema"}),"\n",(0,r.jsxs)(t.p,{children:["Metrics files must contain a series of ",(0,r.jsx)(t.code,{children:"[[metric]]"})," definitions, in TOML, or the equivalent definition in a YAML file. Each metric definition must follow the exporter's metric schema:"]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Field Name"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Required"}),(0,r.jsx)(t.th,{children:"Default"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"context"}),(0,r.jsx)(t.td,{children:"Metric context, used to build metric FQN"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"labels"}),(0,r.jsx)(t.td,{children:"Metric labels, which must match column names in the query. Any column that is not a label will be parsed as a metric"}),(0,r.jsx)(t.td,{children:"Array of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricsdesc"}),(0,r.jsx)(t.td,{children:"Mapping between field(s) in the request and comment(s)"}),(0,r.jsx)(t.td,{children:"Dictionary of Strings"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricstype"}),(0,r.jsxs)(t.td,{children:["Mapping between field(s) in the request and ",(0,r.jsx)(t.a,{href:"https://prometheus.io/docs/concepts/metric_types/",children:"Prometheus metric types"})]}),(0,r.jsx)(t.td,{children:"Dictionary of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metricsbuckets"}),(0,r.jsxs)(t.td,{children:["Split ",(0,r.jsx)(t.a,{href:"https://prometheus.io/docs/concepts/metric_types/#histogram",children:"histogram"})," metric types into buckets based on value (",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/metric-histogram-example.toml",children:"example"}),")"]}),(0,r.jsx)(t.td,{children:"Dictionary of String dictionaries"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"fieldtoappend"}),(0,r.jsxs)(t.td,{children:["Field from the request to append to the metric FQN. This field will ",(0,r.jsx)(t.strong,{children:"not"})," be included in the metric labels."]}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"request"}),(0,r.jsx)(t.td,{children:"Oracle database query to run for metrics scraping"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Yes"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ignorezeroresult"}),(0,r.jsx)(t.td,{children:"Whether or not an error will be printed if the request does not return any results"}),(0,r.jsx)(t.td,{children:"Boolean"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"false"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"querytimeout"}),(0,r.jsx)(t.td,{children:"Oracle Database query timeout duration, e.g., 300ms, 0.5h"}),(0,r.jsx)(t.td,{children:"String duration"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{children:"Value of query.timeout in seconds"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"scrapeinterval"}),(0,r.jsx)(t.td,{children:"Custom metric scrape interval. If the metric was already scraped during the specified interval, a cached value is provided."}),(0,r.jsx)(t.td,{children:"String duration"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"databases"}),(0,r.jsxs)(t.td,{children:["Array of databases the metric will be scraped from, using the database name from the exporter config file. If not present, the metric is scraped from all databases. If the databases array is empty (",(0,r.jsx)(t.code,{children:"databases = []"}),") the metric will not be scraped, effectively being disabled."]}),(0,r.jsx)(t.td,{children:"Array of Strings"}),(0,r.jsx)(t.td,{children:"No"}),(0,r.jsx)(t.td,{})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"example-metric-definition",children:"Example Metric Definition"}),"\n",(0,r.jsx)(t.p,{children:"Here's a simple example of a metric definition:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "test"\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n'})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsxs)(t.p,{children:["NOTE: Do not add a semicolon (",(0,r.jsx)(t.code,{children:";"}),") at the end of the SQL queries."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"This file produce the following entries in the exporter:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"# HELP oracledb_test_value_1 Simple example returning always 1.\n# TYPE oracledb_test_value_1 gauge\noracledb_test_value_1 1\n# HELP oracledb_test_value_2 Same but returning always 2.\n# TYPE oracledb_test_value_2 gauge\noracledb_test_value_2 2\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can also provide labels using ",(0,r.jsx)(t.code,{children:"labels"})," field. Here's an example providing two metrics, with and without labels:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "context_no_label"\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n\n[[metric]]\ncontext = "context_with_labels"\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2, \'First label\' as label_1, \'Second label\' as label_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\n'})}),"\n",(0,r.jsx)(t.p,{children:"This TOML file produces the following result:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:'# HELP oracledb_context_no_label_value_1 Simple example returning always 1.\n# TYPE oracledb_context_no_label_value_1 gauge\noracledb_context_no_label_value_1 1\n# HELP oracledb_context_no_label_value_2 Same but returning always 2.\n# TYPE oracledb_context_no_label_value_2 gauge\noracledb_context_no_label_value_2 2\n# HELP oracledb_context_with_labels_value_1 Simple example returning always 1.\n# TYPE oracledb_context_with_labels_value_1 gauge\noracledb_context_with_labels_value_1{label_1="First label",label_2="Second label"} 1\n# HELP oracledb_context_with_labels_value_2 Same but returning always 2.\n# TYPE oracledb_context_with_labels_value_2 gauge\noracledb_context_with_labels_value_2{label_1="First label",label_2="Second label"} 2\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Last, you can set metric type using ",(0,r.jsx)(t.strong,{children:"metricstype"})," field."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "context_with_labels"\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2, \'First label\' as label_1, \'Second label\' as label_2 FROM DUAL"\nmetricsdesc = { value_1 = "Simple example returning always 1 as counter.", value_2 = "Same but returning always 2 as gauge." }\n# Can be counter or gauge (default)\nmetricstype = { value_1 = "counter" }\n'})}),"\n",(0,r.jsx)(t.p,{children:"This TOML file will produce the following result:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-text",children:"# HELP oracledb_test_value_1 Simple test example returning always 1 as counter.\n# TYPE oracledb_test_value_1 counter\noracledb_test_value_1 1\n# HELP oracledb_test_value_2 Same test but returning always 2 as gauge.\n# TYPE oracledb_test_value_2 gauge\noracledb_test_value_2 2\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can find ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/custom-metrics.toml",children:"working examples"})," of custom metrics for slow queries, big queries and top 100 tables.\nAn example of ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/txeventq-metrics.toml",children:"custom metrics for Transacational Event Queues"})," is also provided."]}),"\n",(0,r.jsx)(t.h4,{id:"override-existing-individual-metrics",children:"Override Existing, Individual Metrics"}),"\n",(0,r.jsxs)(t.p,{children:["You may override properties for existing metrics by supplying a new, custom metric definition with the same ",(0,r.jsx)(t.code,{children:"context"})," and ",(0,r.jsx)(t.code,{children:"metricsdesc"})," values. For example, if you have an existing metric like so:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "my_default_metric"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\n'})}),"\n",(0,r.jsxs)(t.p,{children:["You can redefine this metric in a custom metrics file to change any properties other than ",(0,r.jsx)(t.code,{children:"context"})," or ",(0,r.jsx)(t.code,{children:"metricsdesc"}),". For example, overriding the previous metric with ",(0,r.jsx)(t.code,{children:"labels"}),", ",(0,r.jsx)(t.code,{children:"scrapeinterval"}),", and ",(0,r.jsx)(t.code,{children:"querytimeout"})," properties:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-toml",children:'[[metric]]\ncontext = "my_default_metric"\nmetricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }\nlabels = [ "label_1", "label_2" ]\nrequest = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"\nscrapeinterval = "30s"\nquerytimeout = "10s"\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Then, provide any metrics overrides as custom metrics files in the ",(0,r.jsx)(t.a,{href:"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/config-file",children:"exporter configuration file"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"metrics:\n ## Paths to any custom metrics files\n custom:\n - my-custom-metrics.toml\n"})}),"\n",(0,r.jsx)(t.p,{children:"If any metric appears more than once in the custom metrics file list, the metric definition in the last file provided takes precedence."}),"\n",(0,r.jsx)(t.h3,{id:"yaml-metrics",children:"YAML Metrics"}),"\n",(0,r.jsx)(t.p,{children:"Metrics may be defined with YAML instead of TOML. YAML metric field names correspond to TOML metric field names."}),"\n",(0,r.jsxs)(t.p,{children:["YAML metrics are defined as a list of ",(0,r.jsx)(t.code,{children:"metrics"})," objects:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:'metrics:\n - context: "sessions"\n labels: [ "inst_id", "status", "type" ]\n metricsdesc:\n value: "Gauge metric with count of sessions by inst_id, status and type."\n request: |\n select inst_id, status, type, count(*) as value\n from gv$session\n group by inst_id, status, type\n'})}),"\n",(0,r.jsxs)(t.p,{children:["The default metrics are provided in YAML format as an example. See ",(0,r.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/default-metrics.yaml",children:"default-metrics.yaml"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"customize-metrics-in-a-container-image",children:"Customize metrics in a container image"}),"\n",(0,r.jsxs)(t.p,{children:["If you run the exporter as a container image and want to include your custom metrics in the image itself, you can use the following example ",(0,r.jsx)(t.code,{children:"Dockerfile"})," to create a new image:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-Dockerfile",children:'FROM container-registry.oracle.com/database/observability-exporter:2.1.0\nCOPY custom-metrics.toml /\nENTRYPOINT ["/oracledb_exporter", "--custom.metrics", "/custom-metrics.toml"]\n'})})]})}function m(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>l,x:()=>a});var s=i(6540);const r={},n=s.createContext(r);function l(e){const t=s.useContext(n);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/3b0dc680.b9962d86.js b/docs/assets/js/3b0dc680.b9962d86.js new file mode 100644 index 00000000..d276a61c --- /dev/null +++ b/docs/assets/js/3b0dc680.b9962d86.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[2035],{3672:(e,t,r)=>{r.d(t,{A:()=>a});const a=r.p+"assets/images/exporter-running-against-basedb-8d8d9efd9a0bec0eb44e25f40e1cced0.png"},4535:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"intro","title":"OpenTelemetry Metrics for Oracle Database","description":"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.","source":"@site/versioned_docs/version-2.2.0/intro.md","sourceDirName":".","slug":"/intro","permalink":"/oracle-db-appdev-monitoring/docs/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/intro.md","tags":[],"version":"2.2.0","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Getting Started","permalink":"/oracle-db-appdev-monitoring/docs/category/getting-started"}}');var n=r(4848),s=r(8453);const o={sidebar_position:1},i="OpenTelemetry Metrics for Oracle Database",c={},l=[{value:"Main Features",id:"main-features",level:2},{value:"Supported Oracle Database Versions",id:"supported-oracle-database-versions",level:2},{value:"Acknowledgements",id:"acknowledgements",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"opentelemetry-metrics-for-oracle-database",children:"OpenTelemetry Metrics for Oracle Database"})}),"\n",(0,n.jsx)(t.p,{children:"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere."}),"\n",(0,n.jsx)(t.p,{children:"The metrics supports monitoring multiple database instances, querying default and custom metrics, and ensures that if one database goes offline for maintenance, the rest stay monitored."}),"\n",(0,n.jsx)(t.p,{children:"Over time, this project will provide not just metrics, but also logging and tracing support, and integration into popular frameworks like Spring Boot. The project aims to deliver functionality to support both cloud and on-premises databases, including those running in Kubernetes and containers."}),"\n",(0,n.jsxs)(t.p,{children:["Contributions are welcome - please see ",(0,n.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/CONTRIBUTING.md",children:"contributing"}),"."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Oracle Database Dashboard",src:r(3672).A+"",width:"1256",height:"1460"})}),"\n",(0,n.jsx)(t.h2,{id:"main-features",children:"Main Features"}),"\n",(0,n.jsx)(t.p,{children:"The exporter supports the following main features"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Exports Oracle Database metrics in standard OTEL/Prometheus format"}),"\n",(0,n.jsx)(t.li,{children:"Works with on-prem, in the cloud, and in Kubernetes, with single instance, clustered, or Autonomous Oracle Database instances"}),"\n",(0,n.jsx)(t.li,{children:"Authenticate with plaintext, TLS, and Oracle Wallet"}),"\n",(0,n.jsx)(t.li,{children:"Secure credentials with Oracle Cloud Infrastructure (OCI) Vault, Azure Vault, or HashiCorp Vault"}),"\n",(0,n.jsx)(t.li,{children:"Load metrics from one or more databases using a single exporter instance"}),"\n",(0,n.jsx)(t.li,{children:"Export the Prometheus Alert Log in JSON format for easy ingest by log aggregators"}),"\n",(0,n.jsx)(t.li,{children:"Pre-buit AMD64 and ARM64 images provided"}),"\n",(0,n.jsx)(t.li,{children:'Standard, default metrics included "out of the box"'}),"\n",(0,n.jsx)(t.li,{children:"Easily define custom metrics using YAML or TOML"}),"\n",(0,n.jsx)(t.li,{children:"Define the scrape interval, database query timeout, and other parameters on a per-metric, per-database level"}),"\n",(0,n.jsx)(t.li,{children:"Customize the database connection pool using go-sql, Oracle Database connection pools, and works with Database Resident Connection Pools"}),"\n",(0,n.jsxs)(t.li,{children:["Includes a sample ",(0,n.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/docker-compose/grafana",children:"Grafana dashboards"})," for inspiration or customization"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"supported-oracle-database-versions",children:"Supported Oracle Database Versions"}),"\n",(0,n.jsx)(t.p,{children:"The Oracle Database Metrics Exporter natively supports Oracle Database versions 19c and 23ai."}),"\n",(0,n.jsx)(t.h2,{id:"acknowledgements",children:"Acknowledgements"}),"\n",(0,n.jsxs)(t.p,{children:["From the v1.0 release onwards, this project provides a ",(0,n.jsx)(t.a,{href:"https://prometheus.io/",children:"Prometheus"})," exporter for Oracle Database based in part on a Prometheus exporter created by ",(0,n.jsx)(t.a,{href:"https://github.com/iamseth/oracledb_exporter",children:"Seth Miller"}),". This project includes changes to comply with various Oracle standards and policies, as well as new features."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:'Seth has archived his exporter as of Feb 13, 2025 and added a note encouraging people to check out ours instead. We wanted to extend a huge "Thank You!" to Seth for the work he did on that exporter, and his contributions to the Oracle and open source communities!'}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>o,x:()=>i});var a=r(6540);const n={},s=a.createContext(n);function o(e){const t=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/449fd331.174b5c00.js b/docs/assets/js/449fd331.174b5c00.js new file mode 100644 index 00000000..5ad7aaea --- /dev/null +++ b/docs/assets/js/449fd331.174b5c00.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[2157],{4914:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"advanced/go-runtime","title":"Configuring the Go Runtime","description":"If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter\'s usage of memory.","source":"@site/versioned_docs/version-2.2.0/advanced/go-runtime.md","sourceDirName":"advanced","slug":"/advanced/go-runtime","permalink":"/oracle-db-appdev-monitoring/docs/advanced/go-runtime","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/advanced/go-runtime.md","tags":[],"version":"2.2.0","sidebarPosition":1,"frontMatter":{"title":"Configuring the Go Runtime","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Advanced","permalink":"/oracle-db-appdev-monitoring/docs/category/advanced"},"next":{"title":"Monitoring TxEventQ","permalink":"/oracle-db-appdev-monitoring/docs/advanced/txeventq"}}');var r=n(4848),i=n(8453);const s={title:"Configuring the Go Runtime",sidebar_position:1},a="Exporter Go Runtime",d={},c=[];function l(e){const t={a:"a",code:"code",h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"exporter-go-runtime",children:"Exporter Go Runtime"})}),"\n",(0,r.jsx)(t.p,{children:"If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter's usage of memory."}),"\n",(0,r.jsx)(t.p,{children:"Under normal circumstances, the exporter process will retain OS memory that was used by the Go garbage collector but is no longer needed, in case it may be needed again in the future, unless the host OS is under memory pressure. The result of this behavior (which is the normal behavior of the Go runtime) is that the resident set size will not decrease until the host OS memory is almost all used. Under most circumstances, this will not cause any issues, but if you are in an environment where you need to conserve memory, the following options are provided:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["You may set the ",(0,r.jsx)(t.code,{children:"FREE_INTERVAL"})," environment variable to a Go ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/maze.io/x/duration",children:"duration string"}),", e.g., ",(0,r.jsx)(t.code,{children:"60s"})," and run the exporter in debug mode by setting the ",(0,r.jsx)(t.code,{children:"GODEBUG"})," environment variable to a value including ",(0,r.jsx)(t.code,{children:"madvdontneed=1"}),", e.g., ",(0,r.jsx)(t.code,{children:"GODEBUG=gctrace=1,madvdontneed=1"}),". The exporter will call the ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/runtime/debug#FreeOSMemory",children:"FreeOSMemory()"})," at the specified interval. This tells the Go runtime to attempt to release memory which is no longer needed. Please note that this does not guarantee that the memory will be released to the OS, but over time you should see the RSS shrink sooner than without these settings."]}),"\n",(0,r.jsxs)(t.li,{children:["You may set the ",(0,r.jsx)(t.code,{children:"RESTART_INTERVAL"})," environment variable to a Go ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/maze.io/x/duration",children:"duration string"}),", e.g., ",(0,r.jsx)(t.code,{children:"10m"}),". The exporter will restart its own process at the specified iterval (by calling the OS ",(0,r.jsx)(t.code,{children:"exec"})," syscall). As no new process is created, the process identifier (PID) does not change, but the machine code, data, heap, and stack of the process are replaced by those of the new program (source: ",(0,r.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Exec_(system_call)",children:"Wikipedia"}),"). This has the side effect of freeing the resident set, so that it will return to its original size."]}),"\n",(0,r.jsxs)(t.li,{children:["In addition to these, you may also set ",(0,r.jsx)(t.code,{children:"GOMAXPROCS"}),", ",(0,r.jsx)(t.code,{children:"GOGC"}),", and ",(0,r.jsx)(t.code,{children:"GOMEMLIMIT"})," (see ",(0,r.jsx)(t.a,{href:"https://pkg.go.dev/runtime#hdr-Environment_Variables",children:"documentation"}),") to further limit the amount of resources that the Go runtime may use."]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var o=n(6540);const r={},i=o.createContext(r);function s(e){const t=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/49d0ab44.8b450938.js b/docs/assets/js/49d0ab44.10e8a595.js similarity index 99% rename from docs/assets/js/49d0ab44.8b450938.js rename to docs/assets/js/49d0ab44.10e8a595.js index 826d2c9a..72170ff9 100644 --- a/docs/assets/js/49d0ab44.8b450938.js +++ b/docs/assets/js/49d0ab44.10e8a595.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[8539],{8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var a=t(6540);const l={},o=a.createContext(l);function r(e){const n=a.useContext(o);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),a.createElement(o.Provider,{value:n},e.children)}},8705:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"configuration/oracle-wallet","title":"Oracle Wallet (mTLS)","description":"For mutual TLS (mTLS) connections, you must use an Oracle Wallet.","source":"@site/docs/configuration/oracle-wallet.md","sourceDirName":"configuration","slug":"/configuration/oracle-wallet","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/oracle-wallet","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/configuration/oracle-wallet.md","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Oracle Wallet (mTLS)","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Multiple Databases","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/multiple-databases"},"next":{"title":"Alert Logs","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/alert-logs"}}');var l=t(4848),o=t(8453);const r={title:"Oracle Wallet (mTLS)",sidebar_position:4},s="Using a Wallet",i={},c=[{value:"mTLS for multiple databases with Oracle Wallet",id:"mtls-for-multiple-databases-with-oracle-wallet",level:3}];function d(e){const n={code:"code",h1:"h1",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.header,{children:(0,l.jsx)(n.h1,{id:"using-a-wallet",children:"Using a Wallet"})}),"\n",(0,l.jsx)(n.p,{children:"For mutual TLS (mTLS) connections, you must use an Oracle Wallet."}),"\n",(0,l.jsx)(n.p,{children:"If you are using Oracle Autonomous Database with mTLS, for example, you can download and unzip the wallet from the Oracle Cloud Infrastructure (OCI) console."}),"\n",(0,l.jsx)(n.p,{children:"To configure the exporter to use an Oracle Wallet,"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Set the ",(0,l.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable to the directory containing the unzipped wallet"]}),"\n",(0,l.jsx)(n.li,{children:"Configure your database instance with the appropriate database TNS name:"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-yaml",children:"databases:\n mydb:\n username: admin\n password: \n # TNS Name from wallet tnsnames.ora file, e.g., mydb_high\n url: \n"})}),"\n",(0,l.jsxs)(n.p,{children:["If you are running the exporter as a container, you can mount the wallet as a volume. For example, mounting the ",(0,l.jsx)(n.code,{children:"./wallet"})," directory to the ",(0,l.jsx)(n.code,{children:"/wallet"})," location:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"docker run -it --rm \\\n -e DB_USERNAME=pdbadmin \\\n -e DB_PASSWORD=Welcome12345 \\\n -e DB_CONNECT_STRING=devdb_tp \\\n -v ./wallet:/wallet \\\n -p 9161:9161 \\\n container-registry.oracle.com/database/observability-exporter:2.1.0\n"})}),"\n",(0,l.jsx)(n.h3,{id:"mtls-for-multiple-databases-with-oracle-wallet",children:"mTLS for multiple databases with Oracle Wallet"}),"\n",(0,l.jsxs)(n.p,{children:["The Oracle Database Metrics exporter uses ODPI-C, which can only initalize the TNS aliases from a ",(0,l.jsx)(n.code,{children:"tnsnames.ora"}),' file once per process. To work around this, the exporter can be configured to read from a "combined" ',(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file containing all TNS aliases for connections in a multi-database configuration."]}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsx)(n.p,{children:"For each database the exporter will connect to, download the corresponding wallet files. If you're using ADB/ATP-S, download the regional wallet instead of the instance wallet if the databases are in the same region."}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:["Copy the TNS aliases the ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file from each wallet, and combine them into one file, so all your database service names are in one file together"]}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:["In the combined ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file, and add the following snippet to each TNS alias connection string, to tell the client where the wallet directory is:"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"(security=(MY_WALLET_DIRECTORY=/path/to/this/database/wallet))\n"})}),"\n",(0,l.jsxs)(n.p,{children:["The combined ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file, which contains the TNS aliases for both databases, and their corresponding wallet location in the ",(0,l.jsx)(n.code,{children:"security"})," configuration will look something like the following:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-sql",children:"db1_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db1)(ssl_server_dn_match=yes)))\n\ndb2_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db2)(ssl_server_dn_match=yes)))\n"})}),"\n",(0,l.jsxs)(n.ol,{start:"4",children:["\n",(0,l.jsxs)(n.li,{children:["Take wallet files (cwallet.sso, ewallet.p12, & ewallet.pem) for each database, and place them in separate directories. For example, ",(0,l.jsx)(n.code,{children:"db1"})," gets its own directory, ",(0,l.jsx)(n.code,{children:"db2"})," gets its own directory, and so forth."]}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:["The resulting directory structure should look like the following, with wallet information separate from the combined ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"wallets\n\u251c\u2500\u2500 combined\n\u2502 \u251c\u2500\u2500 sqlnet.ora\n\u2502 \u2514\u2500\u2500 tnsnames.ora // Combined tnsnames.ora\n\u251c\u2500\u2500 db1\n\u2502 \u251c\u2500\u2500 cwallet.sso\n\u2502 \u251c\u2500\u2500 ewallet.p12\n\u2502 \u2514\u2500\u2500 ewallet.pem\n\u2514\u2500\u2500 db2\n\u251c\u2500\u2500 cwallet.sso\n\u251c\u2500\u2500 ewallet.p12\n\u2514\u2500\u2500 ewallet.pem\n"})}),"\n",(0,l.jsxs)(n.ol,{start:"5",children:["\n",(0,l.jsxs)(n.li,{children:["Set the ",(0,l.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable where the exporter is running to the directory containing your combined ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"export TNS_ADMIN=/wallets/combined\n"})}),"\n",(0,l.jsxs)(n.ol,{start:"6",children:["\n",(0,l.jsxs)(n.li,{children:["Finally, update the exporter configuration file to include the TNS aliases for all databases you will be connecting to. Ensure your database configuration file does not use the ",(0,l.jsx)(n.code,{children:"tnsAdmin"})," property, as we are using the global ",(0,l.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable to point to the combined ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-yaml",children:"databases:\n db2:\n username: ****\n password: ****\n url: db2_high\n queryTimeout: 5\n maxOpenConns: 10\n maxIdleConns: 10\n db1:\n username: ****\n password: ****\n url: db1_high\n queryTimeout: 5\n maxOpenConns: 10\n maxIdleConns: 10\n"})}),"\n",(0,l.jsx)(n.p,{children:"Then, run the exporter with the config file:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./oracledb_exporter --config.file=my-config-file.yaml\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[8539],{8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var a=t(6540);const l={},o=a.createContext(l);function r(e){const n=a.useContext(o);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:r(e.components),a.createElement(o.Provider,{value:n},e.children)}},8705:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"configuration/oracle-wallet","title":"Oracle Wallet (mTLS)","description":"For mutual TLS (mTLS) connections, you must use an Oracle Wallet.","source":"@site/docs/configuration/oracle-wallet.md","sourceDirName":"configuration","slug":"/configuration/oracle-wallet","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/oracle-wallet","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/configuration/oracle-wallet.md","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Oracle Wallet (mTLS)","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Multiple Databases","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/multiple-databases"},"next":{"title":"Alert Logs","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/alert-logs"}}');var l=t(4848),o=t(8453);const r={title:"Oracle Wallet (mTLS)",sidebar_position:4},s="Using a Wallet",i={},c=[{value:"mTLS for multiple databases with Oracle Wallet",id:"mtls-for-multiple-databases-with-oracle-wallet",level:3}];function d(e){const n={code:"code",h1:"h1",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.header,{children:(0,l.jsx)(n.h1,{id:"using-a-wallet",children:"Using a Wallet"})}),"\n",(0,l.jsx)(n.p,{children:"For mutual TLS (mTLS) connections, you must use an Oracle Wallet."}),"\n",(0,l.jsx)(n.p,{children:"If you are using Oracle Autonomous Database with mTLS, for example, you can download and unzip the wallet from the Oracle Cloud Infrastructure (OCI) console."}),"\n",(0,l.jsx)(n.p,{children:"To configure the exporter to use an Oracle Wallet,"}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["Set the ",(0,l.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable to the directory containing the unzipped wallet"]}),"\n",(0,l.jsx)(n.li,{children:"Configure your database instance with the appropriate database TNS name:"}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-yaml",children:"databases:\n mydb:\n username: admin\n password: \n # TNS Name from wallet tnsnames.ora file, e.g., mydb_high\n url: \n"})}),"\n",(0,l.jsxs)(n.p,{children:["If you are running the exporter as a container, you can mount the wallet as a volume. For example, mounting the ",(0,l.jsx)(n.code,{children:"./wallet"})," directory to the ",(0,l.jsx)(n.code,{children:"/wallet"})," location:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"docker run -it --rm \\\n -e DB_USERNAME=pdbadmin \\\n -e DB_PASSWORD=Welcome12345 \\\n -e DB_CONNECT_STRING=devdb_tp \\\n -v ./wallet:/wallet \\\n -p 9161:9161 \\\n container-registry.oracle.com/database/observability-exporter:2.2.0\n"})}),"\n",(0,l.jsx)(n.h3,{id:"mtls-for-multiple-databases-with-oracle-wallet",children:"mTLS for multiple databases with Oracle Wallet"}),"\n",(0,l.jsxs)(n.p,{children:["The Oracle Database Metrics exporter uses ODPI-C, which can only initalize the TNS aliases from a ",(0,l.jsx)(n.code,{children:"tnsnames.ora"}),' file once per process. To work around this, the exporter can be configured to read from a "combined" ',(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file containing all TNS aliases for connections in a multi-database configuration."]}),"\n",(0,l.jsxs)(n.ol,{children:["\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsx)(n.p,{children:"For each database the exporter will connect to, download the corresponding wallet files. If you're using ADB/ATP-S, download the regional wallet instead of the instance wallet if the databases are in the same region."}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:["Copy the TNS aliases the ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file from each wallet, and combine them into one file, so all your database service names are in one file together"]}),"\n"]}),"\n",(0,l.jsxs)(n.li,{children:["\n",(0,l.jsxs)(n.p,{children:["In the combined ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file, and add the following snippet to each TNS alias connection string, to tell the client where the wallet directory is:"]}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"(security=(MY_WALLET_DIRECTORY=/path/to/this/database/wallet))\n"})}),"\n",(0,l.jsxs)(n.p,{children:["The combined ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file, which contains the TNS aliases for both databases, and their corresponding wallet location in the ",(0,l.jsx)(n.code,{children:"security"})," configuration will look something like the following:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-sql",children:"db1_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db1)(ssl_server_dn_match=yes)))\n\ndb2_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db2)(ssl_server_dn_match=yes)))\n"})}),"\n",(0,l.jsxs)(n.ol,{start:"4",children:["\n",(0,l.jsxs)(n.li,{children:["Take wallet files (cwallet.sso, ewallet.p12, & ewallet.pem) for each database, and place them in separate directories. For example, ",(0,l.jsx)(n.code,{children:"db1"})," gets its own directory, ",(0,l.jsx)(n.code,{children:"db2"})," gets its own directory, and so forth."]}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:["The resulting directory structure should look like the following, with wallet information separate from the combined ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"wallets\n\u251c\u2500\u2500 combined\n\u2502 \u251c\u2500\u2500 sqlnet.ora\n\u2502 \u2514\u2500\u2500 tnsnames.ora // Combined tnsnames.ora\n\u251c\u2500\u2500 db1\n\u2502 \u251c\u2500\u2500 cwallet.sso\n\u2502 \u251c\u2500\u2500 ewallet.p12\n\u2502 \u2514\u2500\u2500 ewallet.pem\n\u2514\u2500\u2500 db2\n\u251c\u2500\u2500 cwallet.sso\n\u251c\u2500\u2500 ewallet.p12\n\u2514\u2500\u2500 ewallet.pem\n"})}),"\n",(0,l.jsxs)(n.ol,{start:"5",children:["\n",(0,l.jsxs)(n.li,{children:["Set the ",(0,l.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable where the exporter is running to the directory containing your combined ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"export TNS_ADMIN=/wallets/combined\n"})}),"\n",(0,l.jsxs)(n.ol,{start:"6",children:["\n",(0,l.jsxs)(n.li,{children:["Finally, update the exporter configuration file to include the TNS aliases for all databases you will be connecting to. Ensure your database configuration file does not use the ",(0,l.jsx)(n.code,{children:"tnsAdmin"})," property, as we are using the global ",(0,l.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable to point to the combined ",(0,l.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-yaml",children:"databases:\n db2:\n username: ****\n password: ****\n url: db2_high\n queryTimeout: 5\n maxOpenConns: 10\n maxIdleConns: 10\n db1:\n username: ****\n password: ****\n url: db1_high\n queryTimeout: 5\n maxOpenConns: 10\n maxIdleConns: 10\n"})}),"\n",(0,l.jsx)(n.p,{children:"Then, run the exporter with the config file:"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./oracledb_exporter --config.file=my-config-file.yaml\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4aa3d183.463971a1.js b/docs/assets/js/4aa3d183.463971a1.js new file mode 100644 index 00000000..cf664cb6 --- /dev/null +++ b/docs/assets/js/4aa3d183.463971a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[9648],{4816:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"advanced/txeventq","title":"Monitoring TxEventQ","description":"Oracle Transactional Event Queues (\\"TxEventQ\\") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.","source":"@site/versioned_docs/version-2.1.0/advanced/txeventq.md","sourceDirName":"advanced","slug":"/advanced/txeventq","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/txeventq","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/advanced/txeventq.md","tags":[],"version":"2.1.0","sidebarPosition":2,"frontMatter":{"title":"Monitoring TxEventQ","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Configuring the Go Runtime","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/go-runtime"},"next":{"title":"Development","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/development"}}');var s=n(4848),o=n(8453);const r={title:"Monitoring TxEventQ",sidebar_position:2},i="Monitoring Transactional Event Queues",c={},d=[{value:"How to create some traffic with PL/SQL",id:"how-to-create-some-traffic-with-plsql",level:3},{value:"How to create some traffic with Java (Spring Boot)",id:"how-to-create-some-traffic-with-java-spring-boot",level:3},{value:"Metrics definitions",id:"metrics-definitions",level:3},{value:"Additional database permissions",id:"additional-database-permissions",level:3},{value:"Grafana dashboard",id:"grafana-dashboard",level:3}];function l(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"monitoring-transactional-event-queues",children:"Monitoring Transactional Event Queues"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://docs.oracle.com/en/database/oracle/oracle-database/23/adque/index.html",children:"Oracle Transactional Event Queues"}),' ("TxEventQ") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.']}),"\n",(0,s.jsx)(t.p,{children:"Access to the real-time broker, producer, and consumer metrics in a single dashboard and receiving alerts for issues allows teams to understand the state of their system."}),"\n",(0,s.jsx)(t.p,{children:"The exporter includes a set of metrics for monitoring TxEventQ and a pre-built Grafana dashboard."}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Note: The metrics are written for Oracle Database 21c or later."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"how-to-create-some-traffic-with-plsql",children:"How to create some traffic with PL/SQL"}),"\n",(0,s.jsx)(t.p,{children:"If you need to create a topic to monitor, you can use these statements to create and start a topic, and create a subscriber:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"declare\n subscriber sys.aq$_agent;\nbegin\n -- create the topic\n dbms_aqadm.create_transactional_event_queue(\n queue_name => 'my_topic',\n multiple_consumers => true -- true makes a pub/sub topic\n );\n\n -- start the topic\n dbms_aqadm.start_queue(\n queue_name => 'my_topic'\n );\n\n -- create a subscriber\n dbms_aqadm.add_subscriber(\n queue_name => 'my_teq',\n subscriber => sys.aq$_agent(\n 'my_subscriber', -- the subscriber name\n null, -- address, only used for notifications\n 0 -- protocol\n ),\n rule => 'correlation = ''my_subscriber'''\n );\nend;\n"})}),"\n",(0,s.jsx)(t.p,{children:"You can produce a message with these commands:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"declare\n enqueue_options dbms_aq.enqueue_options_t;\n message_properties dbms_aq.message_properties_t;\n message_handle raw(16);\n message SYS.AQ$_JMS_TEXT_MESSAGE;\nbegin\n -- create the message payload\n message := SYS.AQ$_JMS_TEXT_MESSAGE.construct;\n message.set_text('{\"orderid\": 12345, \"username\": \"Jessica Smith\"}');\n\n -- set the consumer name\n message_properties.correlation := 'my_subscriber';\n\n -- enqueue the message\n dbms_aq.enqueue(\n queue_name => 'my_topic',\n enqueue_options => enqueue_options,\n message_properties => message_properties,\n payload => message,\n msgid => message_handle);\n\n -- commit the transaction\n commit;\nend;\n"})}),"\n",(0,s.jsx)(t.h3,{id:"how-to-create-some-traffic-with-java-spring-boot",children:"How to create some traffic with Java (Spring Boot)"}),"\n",(0,s.jsxs)(t.p,{children:["A simple load generator is provided in ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/docker-compose/txeventq-load",children:"this directory"})," which you can use to create some traffic so you can experiment with the sample dashboard."]}),"\n",(0,s.jsxs)(t.p,{children:["To run the sample, first update ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/docker-compose/txeventq-load/src/main/resources/application.yaml",children:"application.yaml"})," with the correct IP address for your database, then start the application as follows:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"mvn spring-boot:run\n"})}),"\n",(0,s.jsx)(t.p,{children:"The application will create ten queues names TOPIC_0 through TOPIC_9 and randomly produce and consume messages on those queues. The example dashboard shown below was monitoring traffic produced using this application."}),"\n",(0,s.jsx)(t.h3,{id:"metrics-definitions",children:"Metrics definitions"}),"\n",(0,s.jsxs)(t.p,{children:["The metrics definitions are provided in ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/txeventq-metrics.toml",children:"this file"}),". You need to provide this file to the exporter, e.g., by adding it to your container image, or creating a Kubernetes config map containing the file and mounting that config map as a volume in your deployment. You also need to set the ",(0,s.jsx)(t.code,{children:"CUSTOM_METRICS"})," environment variable to the location of this file."]}),"\n",(0,s.jsx)(t.h3,{id:"additional-database-permissions",children:"Additional database permissions"}),"\n",(0,s.jsx)(t.p,{children:'The database user that the exporter uses to connect to the database will also need additional permissions, which can be granted with these statements. This example assumes the exporter connects with the username "exporter":'}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"grant execute on dbms_aq to exporter;\ngrant execute on dbms_aqadm to exporter;\ngrant execute on dbms_aqin to exporter;\ngrant execute on dbms_aqjms_internal to exporter;\ngrant execute on dbms_teqk to exporter;\ngrant execute on DBMS_RESOURCE_MANAGER to exporter;\ngrant select_catalog_role to exporter;\ngrant select on sys.aq$_queue_shards to exporter;\ngrant select on user_queue_partition_assignment_table to exporter;\n"})}),"\n",(0,s.jsx)(t.h3,{id:"grafana-dashboard",children:"Grafana dashboard"}),"\n",(0,s.jsxs)(t.p,{children:["A Grafana dashboard for Transactional Event Queues is provided ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/docker-compose/grafana/dashboards/txeventq.json",children:"in this file"}),". This can be imported into your Grafana environment. Choose the Prometheus datasource that is collecting metrics from the exporter."]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Note: You may not see any activity on the dashboard unless there are clients producing and consuming messages from topics."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The dashboard will look like this:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Oracle Database Dashboard",src:n(7242).A+"",width:"1893",height:"1487"})})]})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},7242:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/txeventq-dashboard-v2-880ceab000b0e8c267e0eedf322350d4.png"},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>i});var a=n(6540);const s={},o=a.createContext(s);function r(e){const t=a.useContext(o);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4ea38b47.ae5193ec.js b/docs/assets/js/4ea38b47.ae5193ec.js deleted file mode 100644 index 60bafb70..00000000 --- a/docs/assets/js/4ea38b47.ae5193ec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6499],{4369:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"configuration/oci-vault","title":"OCI Vault","description":"Securely load database credentials from OCI Vault.","source":"@site/versioned_docs/version-2.1.0/configuration/oci-vault.md","sourceDirName":"configuration","slug":"/configuration/oci-vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oci-vault","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/oci-vault.md","tags":[],"version":"2.1.0","sidebarPosition":6,"frontMatter":{"title":"OCI Vault","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"Alert Logs","permalink":"/oracle-db-appdev-monitoring/docs/configuration/alert-logs"},"next":{"title":"Azure Vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/azure-vault"}}');var o=n(4848),r=n(8453);const i={title:"OCI Vault",sidebar_position:6},s="Oracle Cloud Infrastructure (OCI) Vault",c={},l=[{value:"OCI Vault CLI Configuration",id:"oci-vault-cli-configuration",level:3}];function d(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"oracle-cloud-infrastructure-oci-vault",children:"Oracle Cloud Infrastructure (OCI) Vault"})}),"\n",(0,o.jsx)(t.p,{children:"Securely load database credentials from OCI Vault."}),"\n",(0,o.jsxs)(t.p,{children:["Each database in the config file may be configured to use OCI Vault. To load the database username and/or password from OCI Vault, set the ",(0,o.jsx)(t.code,{children:"vault.oci"})," property to contain the OCI Vault OCID, and secret names for the database username/password:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n oci:\n id: \n usernameSecret: \n passwordSecret: \n"})}),"\n",(0,o.jsx)(t.h3,{id:"oci-vault-cli-configuration",children:"OCI Vault CLI Configuration"}),"\n",(0,o.jsx)(t.p,{children:"If using the default database with CLI parameters, the exporter will read the username and password from a secret stored in OCI Vault if you set these two environment variables:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"OCI_VAULT_ID"})," should be set to the OCID of the OCI vault that you wish to use"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"OCI_VAULT_USERNAME_SECRET"})," should be set to the name of the secret in the OCI vault which contains the database username"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"OCI_VAULT_PASSWORD_SECRET"})," should be set to the name of the secret in the OCI vault which contains the database password"]}),"\n"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Note that the process must be running under a user that has the OCI CLI installed and configured correctly to access the desired tenancy and region. The OCI Profile used is ",(0,o.jsx)(t.code,{children:"DEFAULT"}),"."]}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>s});var a=n(6540);const o={},r=a.createContext(o);function i(e){const t=a.useContext(r);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4ea38b47.c09575a2.js b/docs/assets/js/4ea38b47.c09575a2.js new file mode 100644 index 00000000..265469a1 --- /dev/null +++ b/docs/assets/js/4ea38b47.c09575a2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6499],{4369:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"configuration/oci-vault","title":"OCI Vault","description":"Securely load database credentials from OCI Vault.","source":"@site/versioned_docs/version-2.1.0/configuration/oci-vault.md","sourceDirName":"configuration","slug":"/configuration/oci-vault","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oci-vault","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/oci-vault.md","tags":[],"version":"2.1.0","sidebarPosition":6,"frontMatter":{"title":"OCI Vault","sidebar_position":6},"sidebar":"tutorialSidebar","previous":{"title":"Alert Logs","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/alert-logs"},"next":{"title":"Azure Vault","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/azure-vault"}}');var o=n(4848),r=n(8453);const i={title:"OCI Vault",sidebar_position:6},s="Oracle Cloud Infrastructure (OCI) Vault",c={},l=[{value:"OCI Vault CLI Configuration",id:"oci-vault-cli-configuration",level:3}];function d(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"oracle-cloud-infrastructure-oci-vault",children:"Oracle Cloud Infrastructure (OCI) Vault"})}),"\n",(0,o.jsx)(t.p,{children:"Securely load database credentials from OCI Vault."}),"\n",(0,o.jsxs)(t.p,{children:["Each database in the config file may be configured to use OCI Vault. To load the database username and/or password from OCI Vault, set the ",(0,o.jsx)(t.code,{children:"vault.oci"})," property to contain the OCI Vault OCID, and secret names for the database username/password:"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n oci:\n id: \n usernameSecret: \n passwordSecret: \n"})}),"\n",(0,o.jsx)(t.h3,{id:"oci-vault-cli-configuration",children:"OCI Vault CLI Configuration"}),"\n",(0,o.jsx)(t.p,{children:"If using the default database with CLI parameters, the exporter will read the username and password from a secret stored in OCI Vault if you set these two environment variables:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"OCI_VAULT_ID"})," should be set to the OCID of the OCI vault that you wish to use"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"OCI_VAULT_USERNAME_SECRET"})," should be set to the name of the secret in the OCI vault which contains the database username"]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.code,{children:"OCI_VAULT_PASSWORD_SECRET"})," should be set to the name of the secret in the OCI vault which contains the database password"]}),"\n"]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["Note that the process must be running under a user that has the OCI CLI installed and configured correctly to access the desired tenancy and region. The OCI Profile used is ",(0,o.jsx)(t.code,{children:"DEFAULT"}),"."]}),"\n"]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>s});var a=n(6540);const o={},r=a.createContext(o);function i(e){const t=a.useContext(r);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4fa4138c.59d959fc.js b/docs/assets/js/4fa4138c.59d959fc.js new file mode 100644 index 00000000..ee989209 --- /dev/null +++ b/docs/assets/js/4fa4138c.59d959fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[289],{8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var r=n(6540);const a={},i=r.createContext(a);function o(e){const t=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:t},e.children)}},9279:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"configuration/azure-vault","title":"Azure Vault","description":"Securely load database credentials from Azure Vault.","source":"@site/versioned_docs/version-2.2.0/configuration/azure-vault.md","sourceDirName":"configuration","slug":"/configuration/azure-vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/azure-vault","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/configuration/azure-vault.md","tags":[],"version":"2.2.0","sidebarPosition":7,"frontMatter":{"title":"Azure Vault","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"OCI Vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oci-vault"},"next":{"title":"HashiCorp Vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/hashicorp-vault"}}');var a=n(4848),i=n(8453);const o={title:"Azure Vault",sidebar_position:7},s="Azure Vault",u={},l=[{value:"Authentication",id:"authentication",level:3},{value:"Azure Vault CLI Configuration (without exporter config file)",id:"azure-vault-cli-configuration-without-exporter-config-file",level:3}];function c(e){const t={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"azure-vault",children:"Azure Vault"})}),"\n",(0,a.jsx)(t.p,{children:"Securely load database credentials from Azure Vault."}),"\n",(0,a.jsxs)(t.p,{children:["Each database in the config file may be configured to use Azure Vault. To load the database username and/or password from Azure Vault, set the ",(0,a.jsx)(t.code,{children:"vault.azure"})," property to contain the Azure Vault ID, and secret names for the database username/password:"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n azure:\n id: \n usernameSecret: \n passwordSecret: \n"})}),"\n",(0,a.jsx)(t.h3,{id:"authentication",children:"Authentication"}),"\n",(0,a.jsxs)(t.p,{children:["If you are running the exporter outside Azure, we recommend using ",(0,a.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/developer/go/sdk/authentication/authentication-on-premises-apps",children:"application service principal"}),"."]}),"\n",(0,a.jsxs)(t.p,{children:["If you are running the exporter inside Azure, we recommend using a ",(0,a.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/developer/go/sdk/authentication/authentication-azure-hosted-apps",children:"managed identity"}),"."]}),"\n",(0,a.jsx)(t.p,{children:"You should set the following additional environment variables to allow the exporter to authenticate to Azure:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"AZURE_TENANT_ID"})," should be set to your tenant ID"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"AZURE_CLIENT_ID"})," should be set to the client ID to authenticate to Azure"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"AZURE_CLIENT_SECRET"})," should be set to the client secret to authenticate to Azure"]}),"\n"]}),"\n",(0,a.jsx)(t.h3,{id:"azure-vault-cli-configuration-without-exporter-config-file",children:"Azure Vault CLI Configuration (without exporter config file)"}),"\n",(0,a.jsx)(t.p,{children:"If using the default database with CLI parameters, the exporter will read the database username and password from secrets stored in Azure Key Vault if you set these environment variables:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"AZ_VAULT_ID"})," should be set to the ID of the Azure Key Vault that you wish to use"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"AZ_VAULT_USERNAME_SECRET"})," should be set to the name of the secret in the Azure Key Vault which contains the database username"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.code,{children:"AZ_VAULT_PASSWORD_SECRET"})," should be set to the name of the secret in the Azure Key Vault which contains the database password"]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4aa3d183.d48746f2.js b/docs/assets/js/4fc09e7a.02b2cf70.js similarity index 97% rename from docs/assets/js/4aa3d183.d48746f2.js rename to docs/assets/js/4fc09e7a.02b2cf70.js index 6355e476..d0e221d0 100644 --- a/docs/assets/js/4aa3d183.d48746f2.js +++ b/docs/assets/js/4fc09e7a.02b2cf70.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[9648],{4816:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"advanced/txeventq","title":"Monitoring TxEventQ","description":"Oracle Transactional Event Queues (\\"TxEventQ\\") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.","source":"@site/versioned_docs/version-2.1.0/advanced/txeventq.md","sourceDirName":"advanced","slug":"/advanced/txeventq","permalink":"/oracle-db-appdev-monitoring/docs/advanced/txeventq","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/advanced/txeventq.md","tags":[],"version":"2.1.0","sidebarPosition":2,"frontMatter":{"title":"Monitoring TxEventQ","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Configuring the Go Runtime","permalink":"/oracle-db-appdev-monitoring/docs/advanced/go-runtime"},"next":{"title":"Development","permalink":"/oracle-db-appdev-monitoring/docs/advanced/development"}}');var s=n(4848),o=n(8453);const r={title:"Monitoring TxEventQ",sidebar_position:2},i="Monitoring Transactional Event Queues",c={},d=[{value:"How to create some traffic with PL/SQL",id:"how-to-create-some-traffic-with-plsql",level:3},{value:"How to create some traffic with Java (Spring Boot)",id:"how-to-create-some-traffic-with-java-spring-boot",level:3},{value:"Metrics definitions",id:"metrics-definitions",level:3},{value:"Additional database permissions",id:"additional-database-permissions",level:3},{value:"Grafana dashboard",id:"grafana-dashboard",level:3}];function l(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"monitoring-transactional-event-queues",children:"Monitoring Transactional Event Queues"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://docs.oracle.com/en/database/oracle/oracle-database/23/adque/index.html",children:"Oracle Transactional Event Queues"}),' ("TxEventQ") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.']}),"\n",(0,s.jsx)(t.p,{children:"Access to the real-time broker, producer, and consumer metrics in a single dashboard and receiving alerts for issues allows teams to understand the state of their system."}),"\n",(0,s.jsx)(t.p,{children:"The exporter includes a set of metrics for monitoring TxEventQ and a pre-built Grafana dashboard."}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Note: The metrics are written for Oracle Database 21c or later."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"how-to-create-some-traffic-with-plsql",children:"How to create some traffic with PL/SQL"}),"\n",(0,s.jsx)(t.p,{children:"If you need to create a topic to monitor, you can use these statements to create and start a topic, and create a subscriber:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"declare\n subscriber sys.aq$_agent;\nbegin\n -- create the topic\n dbms_aqadm.create_transactional_event_queue(\n queue_name => 'my_topic',\n multiple_consumers => true -- true makes a pub/sub topic\n );\n\n -- start the topic\n dbms_aqadm.start_queue(\n queue_name => 'my_topic'\n );\n\n -- create a subscriber\n dbms_aqadm.add_subscriber(\n queue_name => 'my_teq',\n subscriber => sys.aq$_agent(\n 'my_subscriber', -- the subscriber name\n null, -- address, only used for notifications\n 0 -- protocol\n ),\n rule => 'correlation = ''my_subscriber'''\n );\nend;\n"})}),"\n",(0,s.jsx)(t.p,{children:"You can produce a message with these commands:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"declare\n enqueue_options dbms_aq.enqueue_options_t;\n message_properties dbms_aq.message_properties_t;\n message_handle raw(16);\n message SYS.AQ$_JMS_TEXT_MESSAGE;\nbegin\n -- create the message payload\n message := SYS.AQ$_JMS_TEXT_MESSAGE.construct;\n message.set_text('{\"orderid\": 12345, \"username\": \"Jessica Smith\"}');\n\n -- set the consumer name\n message_properties.correlation := 'my_subscriber';\n\n -- enqueue the message\n dbms_aq.enqueue(\n queue_name => 'my_topic',\n enqueue_options => enqueue_options,\n message_properties => message_properties,\n payload => message,\n msgid => message_handle);\n\n -- commit the transaction\n commit;\nend;\n"})}),"\n",(0,s.jsx)(t.h3,{id:"how-to-create-some-traffic-with-java-spring-boot",children:"How to create some traffic with Java (Spring Boot)"}),"\n",(0,s.jsxs)(t.p,{children:["A simple load generator is provided in ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/docker-compose/txeventq-load",children:"this directory"})," which you can use to create some traffic so you can experiment with the sample dashboard."]}),"\n",(0,s.jsxs)(t.p,{children:["To run the sample, first update ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/docker-compose/txeventq-load/src/main/resources/application.yaml",children:"application.yaml"})," with the correct IP address for your database, then start the application as follows:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"mvn spring-boot:run\n"})}),"\n",(0,s.jsx)(t.p,{children:"The application will create ten queues names TOPIC_0 through TOPIC_9 and randomly produce and consume messages on those queues. The example dashboard shown below was monitoring traffic produced using this application."}),"\n",(0,s.jsx)(t.h3,{id:"metrics-definitions",children:"Metrics definitions"}),"\n",(0,s.jsxs)(t.p,{children:["The metrics definitions are provided in ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/txeventq-metrics.toml",children:"this file"}),". You need to provide this file to the exporter, e.g., by adding it to your container image, or creating a Kubernetes config map containing the file and mounting that config map as a volume in your deployment. You also need to set the ",(0,s.jsx)(t.code,{children:"CUSTOM_METRICS"})," environment variable to the location of this file."]}),"\n",(0,s.jsx)(t.h3,{id:"additional-database-permissions",children:"Additional database permissions"}),"\n",(0,s.jsx)(t.p,{children:'The database user that the exporter uses to connect to the database will also need additional permissions, which can be granted with these statements. This example assumes the exporter connects with the username "exporter":'}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"grant execute on dbms_aq to exporter;\ngrant execute on dbms_aqadm to exporter;\ngrant execute on dbms_aqin to exporter;\ngrant execute on dbms_aqjms_internal to exporter;\ngrant execute on dbms_teqk to exporter;\ngrant execute on DBMS_RESOURCE_MANAGER to exporter;\ngrant select_catalog_role to exporter;\ngrant select on sys.aq$_queue_shards to exporter;\ngrant select on user_queue_partition_assignment_table to exporter;\n"})}),"\n",(0,s.jsx)(t.h3,{id:"grafana-dashboard",children:"Grafana dashboard"}),"\n",(0,s.jsxs)(t.p,{children:["A Grafana dashboard for Transactional Event Queues is provided ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/docker-compose/grafana/dashboards/txeventq.json",children:"in this file"}),". This can be imported into your Grafana environment. Choose the Prometheus datasource that is collecting metrics from the exporter."]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Note: You may not see any activity on the dashboard unless there are clients producing and consuming messages from topics."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The dashboard will look like this:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Oracle Database Dashboard",src:n(7242).A+"",width:"1893",height:"1487"})})]})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},7242:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/txeventq-dashboard-v2-880ceab000b0e8c267e0eedf322350d4.png"},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>i});var a=n(6540);const s={},o=a.createContext(s);function r(e){const t=a.useContext(o);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4922],{1747:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>r,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"advanced/txeventq","title":"Monitoring TxEventQ","description":"Oracle Transactional Event Queues (\\"TxEventQ\\") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.","source":"@site/versioned_docs/version-2.2.0/advanced/txeventq.md","sourceDirName":"advanced","slug":"/advanced/txeventq","permalink":"/oracle-db-appdev-monitoring/docs/advanced/txeventq","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/advanced/txeventq.md","tags":[],"version":"2.2.0","sidebarPosition":2,"frontMatter":{"title":"Monitoring TxEventQ","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Configuring the Go Runtime","permalink":"/oracle-db-appdev-monitoring/docs/advanced/go-runtime"},"next":{"title":"Development","permalink":"/oracle-db-appdev-monitoring/docs/advanced/development"}}');var s=n(4848),o=n(8453);const r={title:"Monitoring TxEventQ",sidebar_position:2},i="Monitoring Transactional Event Queues",c={},d=[{value:"How to create some traffic with PL/SQL",id:"how-to-create-some-traffic-with-plsql",level:3},{value:"How to create some traffic with Java (Spring Boot)",id:"how-to-create-some-traffic-with-java-spring-boot",level:3},{value:"Metrics definitions",id:"metrics-definitions",level:3},{value:"Additional database permissions",id:"additional-database-permissions",level:3},{value:"Grafana dashboard",id:"grafana-dashboard",level:3}];function l(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"monitoring-transactional-event-queues",children:"Monitoring Transactional Event Queues"})}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"https://docs.oracle.com/en/database/oracle/oracle-database/23/adque/index.html",children:"Oracle Transactional Event Queues"}),' ("TxEventQ") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.']}),"\n",(0,s.jsx)(t.p,{children:"Access to the real-time broker, producer, and consumer metrics in a single dashboard and receiving alerts for issues allows teams to understand the state of their system."}),"\n",(0,s.jsx)(t.p,{children:"The exporter includes a set of metrics for monitoring TxEventQ and a pre-built Grafana dashboard."}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Note: The metrics are written for Oracle Database 21c or later."}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"how-to-create-some-traffic-with-plsql",children:"How to create some traffic with PL/SQL"}),"\n",(0,s.jsx)(t.p,{children:"If you need to create a topic to monitor, you can use these statements to create and start a topic, and create a subscriber:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"declare\n subscriber sys.aq$_agent;\nbegin\n -- create the topic\n dbms_aqadm.create_transactional_event_queue(\n queue_name => 'my_topic',\n multiple_consumers => true -- true makes a pub/sub topic\n );\n\n -- start the topic\n dbms_aqadm.start_queue(\n queue_name => 'my_topic'\n );\n\n -- create a subscriber\n dbms_aqadm.add_subscriber(\n queue_name => 'my_teq',\n subscriber => sys.aq$_agent(\n 'my_subscriber', -- the subscriber name\n null, -- address, only used for notifications\n 0 -- protocol\n ),\n rule => 'correlation = ''my_subscriber'''\n );\nend;\n"})}),"\n",(0,s.jsx)(t.p,{children:"You can produce a message with these commands:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"declare\n enqueue_options dbms_aq.enqueue_options_t;\n message_properties dbms_aq.message_properties_t;\n message_handle raw(16);\n message SYS.AQ$_JMS_TEXT_MESSAGE;\nbegin\n -- create the message payload\n message := SYS.AQ$_JMS_TEXT_MESSAGE.construct;\n message.set_text('{\"orderid\": 12345, \"username\": \"Jessica Smith\"}');\n\n -- set the consumer name\n message_properties.correlation := 'my_subscriber';\n\n -- enqueue the message\n dbms_aq.enqueue(\n queue_name => 'my_topic',\n enqueue_options => enqueue_options,\n message_properties => message_properties,\n payload => message,\n msgid => message_handle);\n\n -- commit the transaction\n commit;\nend;\n"})}),"\n",(0,s.jsx)(t.h3,{id:"how-to-create-some-traffic-with-java-spring-boot",children:"How to create some traffic with Java (Spring Boot)"}),"\n",(0,s.jsxs)(t.p,{children:["A simple load generator is provided in ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/docker-compose/txeventq-load",children:"this directory"})," which you can use to create some traffic so you can experiment with the sample dashboard."]}),"\n",(0,s.jsxs)(t.p,{children:["To run the sample, first update ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/docker-compose/txeventq-load/src/main/resources/application.yaml",children:"application.yaml"})," with the correct IP address for your database, then start the application as follows:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"mvn spring-boot:run\n"})}),"\n",(0,s.jsx)(t.p,{children:"The application will create ten queues names TOPIC_0 through TOPIC_9 and randomly produce and consume messages on those queues. The example dashboard shown below was monitoring traffic produced using this application."}),"\n",(0,s.jsx)(t.h3,{id:"metrics-definitions",children:"Metrics definitions"}),"\n",(0,s.jsxs)(t.p,{children:["The metrics definitions are provided in ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/custom-metrics-example/txeventq-metrics.toml",children:"this file"}),". You need to provide this file to the exporter, e.g., by adding it to your container image, or creating a Kubernetes config map containing the file and mounting that config map as a volume in your deployment. You also need to set the ",(0,s.jsx)(t.code,{children:"CUSTOM_METRICS"})," environment variable to the location of this file."]}),"\n",(0,s.jsx)(t.h3,{id:"additional-database-permissions",children:"Additional database permissions"}),"\n",(0,s.jsx)(t.p,{children:'The database user that the exporter uses to connect to the database will also need additional permissions, which can be granted with these statements. This example assumes the exporter connects with the username "exporter":'}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sql",children:"grant execute on dbms_aq to exporter;\ngrant execute on dbms_aqadm to exporter;\ngrant execute on dbms_aqin to exporter;\ngrant execute on dbms_aqjms_internal to exporter;\ngrant execute on dbms_teqk to exporter;\ngrant execute on DBMS_RESOURCE_MANAGER to exporter;\ngrant select_catalog_role to exporter;\ngrant select on sys.aq$_queue_shards to exporter;\ngrant select on user_queue_partition_assignment_table to exporter;\n"})}),"\n",(0,s.jsx)(t.h3,{id:"grafana-dashboard",children:"Grafana dashboard"}),"\n",(0,s.jsxs)(t.p,{children:["A Grafana dashboard for Transactional Event Queues is provided ",(0,s.jsx)(t.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/docker-compose/grafana/dashboards/txeventq.json",children:"in this file"}),". This can be imported into your Grafana environment. Choose the Prometheus datasource that is collecting metrics from the exporter."]}),"\n",(0,s.jsxs)(t.blockquote,{children:["\n",(0,s.jsx)(t.p,{children:"Note: You may not see any activity on the dashboard unless there are clients producing and consuming messages from topics."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"The dashboard will look like this:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Oracle Database Dashboard",src:n(7242).A+"",width:"1893",height:"1487"})})]})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},7242:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/txeventq-dashboard-v2-880ceab000b0e8c267e0eedf322350d4.png"},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>i});var a=n(6540);const s={},o=a.createContext(s);function r(e){const t=a.useContext(o);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/51aafdc7.9362bbe8.js b/docs/assets/js/51aafdc7.9362bbe8.js new file mode 100644 index 00000000..50edbee5 --- /dev/null +++ b/docs/assets/js/51aafdc7.9362bbe8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[8067],{1640:(e,i,r)=>{r.r(i),r.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>u,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"releases/builds","title":"Builds","description":"The Oracle Database Metrics Exporter publishes cross-platform builds for each release.","source":"@site/versioned_docs/version-2.2.0/releases/builds.md","sourceDirName":"releases","slug":"/releases/builds","permalink":"/oracle-db-appdev-monitoring/docs/releases/builds","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/releases/builds.md","tags":[],"version":"2.2.0","sidebarPosition":3,"frontMatter":{"title":"Builds","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Changelog","permalink":"/oracle-db-appdev-monitoring/docs/releases/changelog"}}');var l=r(4848),s=r(8453);const a={title:"Builds",sidebar_position:3},t=void 0,o={},d=[{value:"Pre-built binaries",id:"pre-built-binaries",level:3},{value:"Container images",id:"container-images",level:3},{value:"Build the Oracle Database Metrics Exporter",id:"build-the-oracle-database-metrics-exporter",level:3},{value:"Install build tools.",id:"install-build-tools",level:4},{value:"How to build metrics exporter binaries",id:"how-to-build-metrics-exporter-binaries",level:4},{value:"How to build metrics exporter container images",id:"how-to-build-metrics-exporter-container-images",level:4},{value:"Build on Oracle Linux",id:"build-on-oracle-linux",level:3},{value:"1. Install build tools",id:"1-install-build-tools",level:4},{value:"2. Clone the exporter git repository",id:"2-clone-the-exporter-git-repository",level:4},{value:"3. Build the binary",id:"3-build-the-binary",level:4}];function c(e){const i={a:"a",code:"code",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.p,{children:"The Oracle Database Metrics Exporter publishes cross-platform builds for each release."}),"\n",(0,l.jsx)(i.p,{children:"Binaries:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"linux/amd64"}),"\n",(0,l.jsx)(i.li,{children:"linux/arm64"}),"\n",(0,l.jsx)(i.li,{children:"darwin/arm64"}),"\n"]}),"\n",(0,l.jsx)(i.p,{children:"Container images:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"linux/amd64"}),"\n",(0,l.jsx)(i.li,{children:"linux/arm64"}),"\n"]}),"\n",(0,l.jsx)(i.h3,{id:"pre-built-binaries",children:"Pre-built binaries"}),"\n",(0,l.jsxs)(i.p,{children:["Download pre-built binaries from the metrics exporter ",(0,l.jsx)(i.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/releases",children:"GitHub Releases page"}),"."]}),"\n",(0,l.jsxs)(i.p,{children:[(0,l.jsx)(i.code,{children:"linux-amd64"}),", ",(0,l.jsx)(i.code,{children:"linux-arm64"}),", and ",(0,l.jsx)(i.code,{children:"darwin-arm64"})," binaries are included, built using GLIBC 2.39. If you require a specific target architecture or are using an older verison of GLIBC, it's recommended to build the metrics exporter binary yourself."]}),"\n",(0,l.jsx)(i.h3,{id:"container-images",children:"Container images"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"docker pull container-registry.oracle.com/database/observability-exporter:${VERSION}\n"})}),"\n",(0,l.jsx)(i.h3,{id:"build-the-oracle-database-metrics-exporter",children:"Build the Oracle Database Metrics Exporter"}),"\n",(0,l.jsx)(i.p,{children:"Follow these steps to build the metrics exporter on a Ubuntu Linux system."}),"\n",(0,l.jsx)(i.h4,{id:"install-build-tools",children:"Install build tools."}),"\n",(0,l.jsxs)(i.p,{children:["Note that ",(0,l.jsx)(i.code,{children:"podman"})," and ",(0,l.jsx)(i.code,{children:"qemu-user-static"})," are only required for container builds."]}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"sudo apt-get -y install podman qemu-user-static golang gcc-aarch64-linux-gnu\n"})}),"\n",(0,l.jsx)(i.h4,{id:"how-to-build-metrics-exporter-binaries",children:"How to build metrics exporter binaries"}),"\n",(0,l.jsx)(i.p,{children:"Linux amd64:"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"make go-build-linux-amd64\n"})}),"\n",(0,l.jsxs)(i.p,{children:["Linux arm64 (requires ",(0,l.jsx)(i.code,{children:"gcc-aarch64-linux-gnu"}),"):"]}),"\n",(0,l.jsx)(i.p,{children:(0,l.jsx)(i.code,{children:"bash make go-build-linux-gcc-arm64 "})}),"\n",(0,l.jsx)(i.p,{children:"Darwin arm64 (requires MacOS platform compilers):"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"make go-build-darwin-arm64\n"})}),"\n",(0,l.jsx)(i.h4,{id:"how-to-build-metrics-exporter-container-images",children:"How to build metrics exporter container images"}),"\n",(0,l.jsx)(i.p,{children:"Creates multi-arch container builds for linux/amd64 and linux/arm64:"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{children:"make podman-build\n"})}),"\n",(0,l.jsx)(i.h3,{id:"build-on-oracle-linux",children:"Build on Oracle Linux"}),"\n",(0,l.jsx)(i.p,{children:"To build on Oracle Linux, follow these steps."}),"\n",(0,l.jsx)(i.h4,{id:"1-install-build-tools",children:"1. Install build tools"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"dnf install -y git golang make\n"})}),"\n",(0,l.jsx)(i.h4,{id:"2-clone-the-exporter-git-repository",children:"2. Clone the exporter git repository"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"git clone git@github.com:oracle/oracle-db-appdev-monitoring.git\n"})}),"\n",(0,l.jsx)(i.h4,{id:"3-build-the-binary",children:"3. Build the binary"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"cd oracle-db-appdev-monitoring\nmake go-build\n"})}),"\n",(0,l.jsxs)(i.p,{children:["You will now have a tar.gz and binary file in the ",(0,l.jsx)(i.code,{children:"dist/"})," directory, named according to your target platform."]}),"\n",(0,l.jsx)(i.p,{children:"For example, for the darwin-arm64 platform:"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{children:"dist/\n\u251c\u2500\u2500 oracledb_exporter-2.2.0.darwin-arm64\n\u2502 \u2514\u2500\u2500 oracledb_exporter\n\u2514\u2500\u2500 oracledb_exporter-2.2.0.darwin-arm64.tar.gz\n"})})]})}function u(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,l.jsx)(i,{...e,children:(0,l.jsx)(c,{...e})}):c(e)}},8453:(e,i,r)=>{r.d(i,{R:()=>a,x:()=>t});var n=r(6540);const l={},s=n.createContext(l);function a(e){const i=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function t(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:a(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/6406a33d.4f197ebc.js b/docs/assets/js/6406a33d.4f197ebc.js new file mode 100644 index 00000000..7169bfc7 --- /dev/null +++ b/docs/assets/js/6406a33d.4f197ebc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[8786],{8453:(e,s,t)=>{t.d(s,{R:()=>a,x:()=>o});var i=t(6540);const n={},r=i.createContext(n);function a(e){const s=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),i.createElement(r.Provider,{value:s},e.children)}},9560:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"advanced/older-versions","title":"Compatibility with Older Database Versions","description":"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.","source":"@site/versioned_docs/version-2.2.0/advanced/older-versions.md","sourceDirName":"advanced","slug":"/advanced/older-versions","permalink":"/oracle-db-appdev-monitoring/docs/advanced/older-versions","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/advanced/older-versions.md","tags":[],"version":"2.2.0","sidebarPosition":4,"frontMatter":{"title":"Compatibility with Older Database Versions","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Development","permalink":"/oracle-db-appdev-monitoring/docs/advanced/development"},"next":{"title":"go-ora Driver","permalink":"/oracle-db-appdev-monitoring/docs/advanced/go-ora"}}');var n=t(4848),r=t(8453);const a={title:"Compatibility with Older Database Versions",sidebar_position:4},o="Older Database Versions",d={},l=[{value:"Known Issues with Older Database Versions",id:"known-issues-with-older-database-versions",level:3},{value:"Disabling incompatible metrics",id:"disabling-incompatible-metrics",level:2}];function c(e){const s={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"older-database-versions",children:"Older Database Versions"})}),"\n",(0,n.jsx)(s.p,{children:"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database."}),"\n",(0,n.jsx)(s.h3,{id:"known-issues-with-older-database-versions",children:"Known Issues with Older Database Versions"}),"\n",(0,n.jsx)(s.p,{children:"If you are running an unsupported version of Oracle Database, you may encounter the following issues:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Metrics using modern SQL syntax may not work. For compatibility, you can disable or modify these metrics."}),"\n",(0,n.jsx)(s.li,{children:'The exporter uses a "thick" database client. Ensure your database client libraries are compatible with your database version.'}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"disabling-incompatible-metrics",children:"Disabling incompatible metrics"}),"\n",(0,n.jsx)(s.p,{children:"To disable an incompatible metric, either remove that metric from the metrics file or configure the metric so it does not apply the affected database:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-toml",children:"[[metric]]\ncontext = \"process\"\nlabels = [ \"inst_id\" ]\nmetricsdesc = { count=\"Gauge metric with count of processes.\" }\nrequest = '''\nselect inst_id, count(*) as count\nfrom gv$process\ngroup by inst_id\n'''\n# Set databases to an empty array to disable the metric entirely,\n# or include only compatible databases in this array.\ndatabases = []\n"})})]})}function p(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/6721cf4c.a42b6b45.js b/docs/assets/js/6721cf4c.a42b6b45.js new file mode 100644 index 00000000..277ef2a7 --- /dev/null +++ b/docs/assets/js/6721cf4c.a42b6b45.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[5361],{8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>o});var s=i(6540);const r={},t=s.createContext(r);function l(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(t.Provider,{value:n},e.children)}},9297:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"releases/changelog","title":"Changelog","description":"List of upcoming and historic changes to the exporter.","source":"@site/versioned_docs/version-2.1.0/releases/changelog.md","sourceDirName":"releases","slug":"/releases/changelog","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/releases/changelog","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/releases/changelog.md","tags":[],"version":"2.1.0","sidebarPosition":2,"frontMatter":{"title":"Changelog","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Roadmap","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/releases/roadmap"},"next":{"title":"Builds","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/releases/builds"}}');var r=i(4848),t=i(8453);const l={title:"Changelog",sidebar_position:2},o="Release Notes",a={},d=[{value:"Next, in-development",id:"next-in-development",level:3},{value:"Version 2.1.0, September 29, 2025",id:"version-210-september-29-2025",level:3},{value:"Version 2.0.4, September 8, 2025",id:"version-204-september-8-2025",level:3},{value:"Version 2.0.3, August 27, 2025",id:"version-203-august-27-2025",level:3},{value:"Version 2.0.2, June 24, 2025",id:"version-202-june-24-2025",level:3},{value:"Version 2.0.1, June 12, 2025",id:"version-201-june-12-2025",level:3},{value:"Version 2.0.0, May 27, 2025",id:"version-200-may-27-2025",level:3},{value:"Version 1.6.1, May 2, 2025",id:"version-161-may-2-2025",level:3},{value:"Version 1.6.0, April 18, 2025",id:"version-160-april-18-2025",level:3},{value:"Version 1.5.5, March 13, 2025",id:"version-155-march-13-2025",level:3},{value:"Version 1.5.4, March 3, 2025",id:"version-154-march-3-2025",level:3},{value:"Version 1.5.3, January 28, 2025",id:"version-153-january-28-2025",level:3},{value:"Version 1.5.2, December 2, 2024",id:"version-152-december-2-2024",level:3},{value:"Version 1.5.1, October 28, 2024",id:"version-151-october-28-2024",level:3},{value:"Version 1.5.0, September 26, 2024",id:"version-150-september-26-2024",level:3},{value:"Version 1.4.0, September 4, 2024",id:"version-140-september-4-2024",level:3},{value:"Version 1.3.1, July 22, 2024",id:"version-131-july-22-2024",level:3},{value:"Version 1.3.0, June 7, 2024",id:"version-130-june-7-2024",level:3},{value:"Version 1.2.1, April 16, 2024",id:"version-121-april-16-2024",level:3},{value:"Version 1.2.0, January 17, 2024",id:"version-120-january-17-2024",level:3},{value:"Version 1.1.1, November 28, 2023",id:"version-111-november-28-2023",level:3},{value:"Version 1.1, October 27, 2023",id:"version-11-october-27-2023",level:3},{value:"Version 1.0, September 13, 2023",id:"version-10-september-13-2023",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"release-notes",children:"Release Notes"})}),"\n",(0,r.jsx)(n.p,{children:"List of upcoming and historic changes to the exporter."}),"\n",(0,r.jsx)(n.h3,{id:"next-in-development",children:"Next, in-development"}),"\n",(0,r.jsx)(n.p,{children:"Our current priorities to support metrics for advanced database features and use cases, like Exadata, GoldenGate, and views included in the Oracle Diagnostics Pack."}),"\n",(0,r.jsx)(n.h3,{id:"version-210-september-29-2025",children:"Version 2.1.0, September 29, 2025"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Updated project dependencies."}),"\n",(0,r.jsx)(n.li,{children:"Standardize multi-arch builds and document supported database versions."}),"\n",(0,r.jsx)(n.li,{children:"The metrics override capability is extended, allowing users to redefine individual existing metrics in custom metrics files. This allows users to modify individual default metrics without wholly replacing the default metrics file."}),"\n",(0,r.jsx)(n.li,{children:"If the exporter fails to connect to a database due to invalid or locked credentials (ORA-01017 or ORA-28000 errors), that database configuration will be invalidated and the exporter will not attempt to re-establish the database connection. Other databases will continue to be scraped."}),"\n",(0,r.jsxs)(n.li,{children:["Metrics with an empty databases array (",(0,r.jsx)(n.code,{children:"databases = []"}),") are now considered disabled, and will not be scraped."]}),"\n",(0,r.jsxs)(n.li,{children:["Increased the default query timeout for the ",(0,r.jsx)(n.code,{children:"top_sql"})," metric to 10 seconds (previously 5 seconds)."]}),"\n",(0,r.jsxs)(n.li,{children:["Metrics using the ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," property will no longer be scraped on every request if they have a cached value. This only applies when the metrics exporter is configured to scrape metrics ",(0,r.jsx)(n.em,{children:"on request"}),", rather than on a global interval."]}),"\n",(0,r.jsxs)(n.li,{children:["Metrics using the ",(0,r.jsx)(n.code,{children:"fieldtoappend"})," property now support labels. The ",(0,r.jsx)(n.code,{children:"wait_time"})," and ",(0,r.jsx)(n.code,{children:"activity"})," default metrics use the ",(0,r.jsx)(n.code,{children:"fieldtoappend"})," property, and now properly display their labels."]}),"\n",(0,r.jsxs)(n.li,{children:["Fix ",(0,r.jsx)(n.code,{children:"wait_time"})," default metric to work with Oracle Database 19c."]}),"\n",(0,r.jsx)(n.li,{children:"Fix an issue where the exporter would unnecessarily scrape metrics with a custom scrape interval."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/romankspb",children:"@romankspb"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/muhammadabdullah-amjad",children:"@muhammadabdullah-amjad"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/MansuyDavid",children:"@MansuyDavid"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/borkoz",children:"@borkoz"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/ristagg",children:"@ristagg"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-204-september-8-2025",children:"Version 2.0.4, September 8, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Added WARN logging when database configurations are duplicated in the exporter configuration."}),"\n",(0,r.jsxs)(n.li,{children:["Added INST_ID to ",(0,r.jsx)(n.code,{children:"gv$"})," query metrics as a label."]}),"\n",(0,r.jsx)(n.li,{children:"Fixed multiple concurrency bugs when the exporter is connected to multiple databases and using a custom scrape interval."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Supporterino",children:"@Supporterino"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/msafdal",children:"@msafdal"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aberinnj",children:"@aberinnj"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-203-august-27-2025",children:"Version 2.0.3, August 27, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Enable configuration of the prometheus webserver from the config file using the ",(0,r.jsx)(n.code,{children:"web"})," prefix."]}),"\n",(0,r.jsx)(n.li,{children:"Allow loading of database password(s) from a file."}),"\n",(0,r.jsx)(n.li,{children:"Fixed a bug where database type (CDB, PDB, etc.) was not reported in certain situations."}),"\n",(0,r.jsxs)(n.li,{children:["Fixed a bug where literal passwords containing the '$' character (in the config file) would be evaluated as environment variables. To use literal passwords with the '$' character, escape the '$' character with a second '$': ",(0,r.jsx)(n.code,{children:"$test$pwd"})," becomes ",(0,r.jsx)(n.code,{children:"$$test$$pwd"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Fixed a bug when using ",(0,r.jsx)(n.code,{children:"metrics.scrapeInterval"})," combined with per-metric scrape intervals that made the available metrics data set inconsistent."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Supporterino",children:"@Supporterino"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aberinnj",children:"@aberinnj"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/redelang",children:"@redelang"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/qrkop",children:"@qrkop"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/KevDi",children:"@KevDi"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/bomuva",children:"@bomuva"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/anilmoris",children:"@anilmoris"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Sycri",children:"@Sycri"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/kizuna-lek",children:"@kizuna-lek"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rfrozza",children:"@rfrozza"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-202-june-24-2025",children:"Version 2.0.2, June 24, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Fixed a case-sensitive issue with resource name in the default metrics file."}),"\n",(0,r.jsx)(n.li,{children:"Add query timeouts to initial database connections, which could cause the exporter to hang in multi-database configurations"}),"\n",(0,r.jsx)(n.li,{children:"Fix an issue where rapidly acquiring connections could cause the exporter to crash. This was more common in multi-database configurations, due to the increased number of connection pools."}),"\n",(0,r.jsx)(n.li,{children:"Update some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rfrozza",children:"@rfrozza"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rafal-szypulka",children:"@rafal-szypulka"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/darkelfit",children:"@darkelfit"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-201-june-12-2025",children:"Version 2.0.1, June 12, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Use gv$ views instead of v$ views to allow collection of metrics from all instances in a cluster. (In preparation for RAC support)."}),"\n",(0,r.jsx)(n.li,{children:"Update some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-200-may-27-2025",children:"Version 2.0.0, May 27, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Fixed an issue with ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," that could cause metrics not to be scraped (#172, #176)."]}),"\n",(0,r.jsxs)(n.li,{children:["Added configuration through a YAML file, passed using the ",(0,r.jsx)(n.code,{children:"--config.file"})," command-line argument. Backwards compatibility is maintained for the command-line arguments, through it is recommended to use the configuration file from the 2.0.0 release onward. It is not recommended to use a combination of command-line arguments and the configuration file."]}),"\n",(0,r.jsx)(n.li,{children:"Added support for multiple databases through the configuration file. As many database instances may be specified as needed, which will be scraped concurrently (#89)."}),"\n",(0,r.jsx)(n.li,{children:"Updated provided dashboards."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-161-may-2-2025",children:"Version 1.6.1, May 2, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Deepak A."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-160-april-18-2025",children:"Version 1.6.0, April 18, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Added support for Azure Key Vault (#200)."}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/4Aiur",children:"4Aiur"})," added missing grants for alert log to the demo environment (#207)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Brian, Damian et al."}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/4Aiur",children:"4Aiur"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-155-march-13-2025",children:"Version 1.5.5, March 13, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/VictorErmakov",children:"@VictorErmakov"})," updated the docker-compose sample with connection pool parameters to avoid fast connect cycling (#191)."]}),"\n",(0,r.jsx)(n.li,{children:"Update default values for connection pool parameters to use go-sql pooling by default to avoid fast connet cycling."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/VictorErmakov",children:"@VictorErmakov"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-154-march-3-2025",children:"Version 1.5.4, March 3, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Based of this recommendation from ",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror?tab=readme-ov-file#pooling",children:"godror"}),", which relates to the two following items, and in discussion with the ODPI-C team, we have introduced additional parameters to allow you to set connection pool parameters, and have set defaults which will avoid fast connect cycling. It is our expectation that a fix may be produced in the underlying ODPI-C library for the underlying issue. In the mean time, these changes will avoid the conditions under which the error can occur."]}),"\n",(0,r.jsx)(n.li,{children:"Fix malloc error (#177, #181)."}),"\n",(0,r.jsx)(n.li,{children:"Fix intermittent connection issues with ADB-S when exporter is run in a container (#169)."}),"\n",(0,r.jsx)(n.li,{children:"Fix Multiple custom metrics files overwrite one another (#179)."}),"\n",(0,r.jsx)(n.li,{children:"Replace go-kit/log with log/slog, due to upstream changes in prometheus/common."}),"\n",(0,r.jsxs)(n.li,{children:["Add support for additional admin roles, expanding list of options for ",(0,r.jsx)(n.code,{children:"DB_ROLE"})," to ",(0,r.jsx)(n.code,{children:"SYSDBA"}),", ",(0,r.jsx)(n.code,{children:"SYSOPER"}),", ",(0,r.jsx)(n.code,{children:"SYSBACKUP"}),", ",(0,r.jsx)(n.code,{children:"SYSDG"}),", ",(0,r.jsx)(n.code,{children:"SYSKM"}),", ",(0,r.jsx)(n.code,{children:"SYSRAC"})," and ",(0,r.jsx)(n.code,{children:"SYSASM"})," (#180)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Jman1993",children:"@Jman1993"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/oey",children:"@oey"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/jlembeck06",children:"@jlembeck06"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Jman1993",children:"@Jman1993"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/PeterP55P",children:"@PeterP55P"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rlagyu0",children:"@rlagyu0"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Sycri",children:"@Sycri"})}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Thank you to ",(0,r.jsx)(n.a,{href:"https://github.com/tgulacsi",children:"@tgulacsi"})," for changes in godror (",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror/issues/361",children:"https://github.com/godror/godror/issues/361"}),", ",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror/issues/360",children:"https://github.com/godror/godror/issues/360"}),"), and to ",(0,r.jsx)(n.a,{href:"https://github.com/cjbj",children:"@cjbj"})," and ",(0,r.jsx)(n.a,{href:"https://github.com/sudarshan12s",children:"@sudarshan12s"})," for support and guidance from ODPI-C (",(0,r.jsx)(n.a,{href:"https://github.com/oracle/odpi",children:"https://github.com/oracle/odpi"}),")."]}),"\n",(0,r.jsx)(n.p,{children:"In this release, we also continued some minor code refactoring."}),"\n",(0,r.jsx)(n.h3,{id:"version-153-january-28-2025",children:"Version 1.5.3, January 28, 2025"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:"Known issue"}),": This release has a known issue that results in the error message ",(0,r.jsx)(n.code,{children:"malloc(): unsorted double linked list corrupted"}),".\nWe recommend staying on 1.5.2 until a new release with a fix is available. We hope to have a fix by early March."]}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Fix over-zealous supression of errors when ",(0,r.jsx)(n.code,{children:"ignorezeroresult = true"})," (#168)."]}),"\n",(0,r.jsxs)(n.li,{children:["When ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," is set, do first scrape immediately, not after the interval (#166)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/redelang",children:"@redelang"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"In this release, we also started some minor code refactoring."}),"\n",(0,r.jsx)(n.h3,{id:"version-152-december-2-2024",children:"Version 1.5.2, December 2, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Update the metric defintion for tablespace usage to report more accurate temp space usage."}),"\n",(0,r.jsx)(n.li,{children:"Revert InstantClient to 21c version due to ADB connectivity issue."}),"\n",(0,r.jsx)(n.li,{children:"Update documentation to explain how to obtain credentials from a wallet."}),"\n",(0,r.jsx)(n.li,{children:"Fix race condition on err variable in scrape() func (by @valrusu)."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aureliocirella",children:"@aureliocirella"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/mitoeth",children:"@mitoeth"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/valrusu",children:"@valrusu"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-151-october-28-2024",children:"Version 1.5.1, October 28, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Added support for using the ",(0,r.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable, which fixes an issue when connecting to Autonomous Database instances using TNS name."]}),"\n",(0,r.jsx)(n.li,{children:"Updated InstantClient to 23ai version for amd64 and latest available 19.24 version for arm64."}),"\n",(0,r.jsxs)(n.li,{children:["Fixed an issue with wrong ",(0,r.jsx)(n.code,{children:"LD_LIBRARY_PATH"})," on some platforms. (#136)"]}),"\n",(0,r.jsxs)(n.li,{children:["Added documentation and an example of using the ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," setting to change the interval at which a certain metric is colected."]}),"\n",(0,r.jsx)(n.li,{children:"Added notes to documentation for extra security parameters needed when using a wallet with Podman."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-150-september-26-2024",children:"Version 1.5.0, September 26, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Support for running the exporter on ARM processors (darwin and linux)."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n",(0,r.jsx)(n.li,{children:'Updated the "test/demo environment" to use newer version of Oracle Database (23.5.0.24.07) and faster startup.'}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-140-september-4-2024",children:"Version 1.4.0, September 4, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Allow multiple custom metrics definition files."}),"\n",(0,r.jsx)(n.li,{children:"Allow query timeout per-metric."}),"\n",(0,r.jsx)(n.li,{children:"Allow scrape interval per-metric."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-131-july-22-2024",children:"Version 1.3.1, July 22, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Alert logs can be disabled by setting parameter ",(0,r.jsx)(n.code,{children:"log.disable"})," to ",(0,r.jsx)(n.code,{children:"1"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"Alert log exporter will stop if it gets three consecutive failures."}),"\n",(0,r.jsx)(n.li,{children:"Updated the list of required permissions."}),"\n",(0,r.jsx)(n.li,{children:"Updated the TxEventQ sample dashboard."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/tux-jochen",children:"@tux-jochen"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-130-june-7-2024",children:"Version 1.3.0, June 7, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Alert logs can be exported for collection by a log reader like Promtail or FluentBit. Default\noutput to ",(0,r.jsx)(n.code,{children:"/log/alert.log"})," in JSON format."]}),"\n",(0,r.jsx)(n.li,{children:"Provide ability to connect as SYSDBA or SYSOPER by setting DB_ROLE."}),"\n",(0,r.jsx)(n.li,{children:"New default metric is added to report the type of database connected to (CDB or PDB)."}),"\n",(0,r.jsx)(n.li,{children:"New default metrics are added for cache hit ratios."}),"\n",(0,r.jsx)(n.li,{children:"Default metrics updated to suppress spurious warnings in log."}),"\n",(0,r.jsx)(n.li,{children:"Wait class metric updated to use a better query."}),"\n",(0,r.jsx)(n.li,{children:"The sample dashboard is updated to include new metrics."}),"\n",(0,r.jsx)(n.li,{children:"Fixed a bug which prevented periodic freeing of memory."}),"\n",(0,r.jsx)(n.li,{children:"Set CLIENT_INFO to a meaningful value."}),"\n",(0,r.jsx)(n.li,{children:"Update Go toolchain to 1.22.4."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/pioro",children:"@pioro"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/savoir81",children:"@savoir81"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-121-april-16-2024",children:"Version 1.2.1, April 16, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Accept max idle and open connections settings as parameters."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-120-january-17-2024",children:"Version 1.2.0, January 17, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Introduced a new feature to periodically restart the process if requested."}),"\n",(0,r.jsx)(n.li,{children:"Introduced a new feature to periodically attempt to free OS memory if requested."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-111-november-28-2023",children:"Version 1.1.1, November 28, 2023"}),"\n",(0,r.jsx)(n.p,{children:"This release just updates some third-party dependencies."}),"\n",(0,r.jsx)(n.h3,{id:"version-11-october-27-2023",children:"Version 1.1, October 27, 2023"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The query for the standard metric ",(0,r.jsx)(n.code,{children:"wait_class"})," has been updated so that it will work in both container databases\nand pluggable databases, including in Oracle Autonomous Database instances. Note that this query will not return\nany data unless the database instance is under load."]}),"\n",(0,r.jsxs)(n.li,{children:["Support for reading the database password from OCI Vault has been added (see ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oci-vault",children:"details"}),")"]}),"\n",(0,r.jsx)(n.li,{children:"Log messages have been improved"}),"\n",(0,r.jsx)(n.li,{children:"Some dependencies have been updated"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-10-september-13-2023",children:"Version 1.0, September 13, 2023"}),"\n",(0,r.jsx)(n.p,{children:"The first production release, v1.0, includes the following features:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A number of ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/default-metrics",children:"standard metrics"})," are exposed,"]}),"\n",(0,r.jsxs)(n.li,{children:["Users can define ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/custom-metrics",children:"custom metrics"}),","]}),"\n",(0,r.jsx)(n.li,{children:"Oracle regularly reviews third-party licenses and scans the code and images, including transitive/recursive dependencies for issues,"}),"\n",(0,r.jsx)(n.li,{children:"Connection to Oracle can be a basic connection or use an Oracle Wallet and TLS - connection to Oracle Autonomous Database is supported,"}),"\n",(0,r.jsx)(n.li,{children:"Metrics for Oracle Transactional Event Queues are also supported,"}),"\n",(0,r.jsx)(n.li,{children:"A Grafana dashboard is provided for Transactional Event Queues, and"}),"\n",(0,r.jsx)(n.li,{children:"A pre-built container image is provided, based on Oracle Linux, and optimized for size and security."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Note that this exporter uses a different Oracle Database driver which in turn uses code directly written by Oracle to access the database. This driver does require an Oracle client. In this initial release, the client is bundled into the container image, however we intend to make that optional in order to minimize the image size."}),"\n",(0,r.jsx)(n.p,{children:"The interfaces for this version have been kept as close as possible to those of earlier alpha releases in this repository to assist with migration. However, it should be expected that there may be breaking changes in future releases."})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/d00c9ef6.fe6fa80b.js b/docs/assets/js/688312e3.eb79b2f8.js similarity index 92% rename from docs/assets/js/d00c9ef6.fe6fa80b.js rename to docs/assets/js/688312e3.eb79b2f8.js index 1d180906..380b3ebb 100644 --- a/docs/assets/js/d00c9ef6.fe6fa80b.js +++ b/docs/assets/js/688312e3.eb79b2f8.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[698],{4905:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>g,frontMatter:()=>l,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"configuration/alert-logs","title":"Alert Logs","description":"Collect export alert logs with a log ingestion tool.","source":"@site/versioned_docs/version-2.1.0/configuration/alert-logs.md","sourceDirName":"configuration","slug":"/configuration/alert-logs","permalink":"/oracle-db-appdev-monitoring/docs/configuration/alert-logs","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/alert-logs.md","tags":[],"version":"2.1.0","sidebarPosition":5,"frontMatter":{"title":"Alert Logs","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Oracle Wallet (mTLS)","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oracle-wallet"},"next":{"title":"OCI Vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oci-vault"}}');var r=o(4848),i=o(8453);const l={title:"Alert Logs",sidebar_position:5},s="Alert logs",a={},d=[];function c(e){const t={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"alert-logs",children:"Alert logs"})}),"\n",(0,r.jsx)(t.p,{children:"Collect export alert logs with a log ingestion tool."}),"\n",(0,r.jsx)(t.p,{children:"The exporter exports alert log records as a JSON file suitable for collection by a log ingestion tool like Promtail or FluentBit."}),"\n",(0,r.jsx)(t.p,{children:"Alert logging is configured with the following parameters in the exporter config file:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Default"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"log.destination"}),(0,r.jsx)(t.td,{children:"Log file path"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"/log/alert.log"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"log.interval"}),(0,r.jsx)(t.td,{children:"Interval to log records"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"15s"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"log.disable"}),(0,r.jsxs)(t.td,{children:["Disable logging if set to ",(0,r.jsx)(t.code,{children:"1"})]}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"0"})})]})]})]}),"\n",(0,r.jsx)(t.p,{children:"Example alert log YAML configuration:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"log:\n # Path of log file\n destination: /opt/exporter/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n"})})]})}function g(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>l,x:()=>s});var n=o(6540);const r={},i=n.createContext(r);function l(e){const t=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[379],{7352:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>g,frontMatter:()=>l,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"configuration/alert-logs","title":"Alert Logs","description":"Collect export alert logs with a log ingestion tool.","source":"@site/versioned_docs/version-2.2.0/configuration/alert-logs.md","sourceDirName":"configuration","slug":"/configuration/alert-logs","permalink":"/oracle-db-appdev-monitoring/docs/configuration/alert-logs","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/configuration/alert-logs.md","tags":[],"version":"2.2.0","sidebarPosition":5,"frontMatter":{"title":"Alert Logs","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Oracle Wallet (mTLS)","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oracle-wallet"},"next":{"title":"OCI Vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oci-vault"}}');var r=o(4848),i=o(8453);const l={title:"Alert Logs",sidebar_position:5},s="Alert logs",a={},d=[];function c(e){const t={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"alert-logs",children:"Alert logs"})}),"\n",(0,r.jsx)(t.p,{children:"Collect export alert logs with a log ingestion tool."}),"\n",(0,r.jsx)(t.p,{children:"The exporter exports alert log records as a JSON file suitable for collection by a log ingestion tool like Promtail or FluentBit."}),"\n",(0,r.jsx)(t.p,{children:"Alert logging is configured with the following parameters in the exporter config file:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Default"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"log.destination"}),(0,r.jsx)(t.td,{children:"Log file path"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"/log/alert.log"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"log.interval"}),(0,r.jsx)(t.td,{children:"Interval to log records"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"15s"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"log.disable"}),(0,r.jsxs)(t.td,{children:["Disable logging if set to ",(0,r.jsx)(t.code,{children:"1"})]}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"0"})})]})]})]}),"\n",(0,r.jsx)(t.p,{children:"Example alert log YAML configuration:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"log:\n # Path of log file\n destination: /opt/exporter/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n"})})]})}function g(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>l,x:()=>s});var n=o(6540);const r={},i=n.createContext(r);function l(e){const t=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/6c3adccd.2bec3054.js b/docs/assets/js/6c3adccd.2bec3054.js new file mode 100644 index 00000000..dd69870c --- /dev/null +++ b/docs/assets/js/6c3adccd.2bec3054.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[7316],{2706:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"advanced/older-versions","title":"Compatibility with Older Database Versions","description":"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.","source":"@site/docs/advanced/older-versions.md","sourceDirName":"advanced","slug":"/advanced/older-versions","permalink":"/oracle-db-appdev-monitoring/docs/next/advanced/older-versions","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/advanced/older-versions.md","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Compatibility with Older Database Versions","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Development","permalink":"/oracle-db-appdev-monitoring/docs/next/advanced/development"},"next":{"title":"go-ora Driver","permalink":"/oracle-db-appdev-monitoring/docs/next/advanced/go-ora"}}');var i=s(4848),a=s(8453);const r={title:"Compatibility with Older Database Versions",sidebar_position:4},o="Older Database Versions",d={},c=[{value:"Known Issues with Older Database Versions",id:"known-issues-with-older-database-versions",level:3},{value:"Disabling incompatible metrics",id:"disabling-incompatible-metrics",level:2}];function l(e){const t={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"older-database-versions",children:"Older Database Versions"})}),"\n",(0,i.jsx)(t.p,{children:"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database."}),"\n",(0,i.jsx)(t.h3,{id:"known-issues-with-older-database-versions",children:"Known Issues with Older Database Versions"}),"\n",(0,i.jsx)(t.p,{children:"If you are running an unsupported version of Oracle Database, you may encounter the following issues:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Metrics using modern SQL syntax may not work. For compatibility, you can disable or modify these metrics."}),"\n",(0,i.jsx)(t.li,{children:'The exporter uses a "thick" database client. Ensure your database client libraries are compatible with your database version.'}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"disabling-incompatible-metrics",children:"Disabling incompatible metrics"}),"\n",(0,i.jsx)(t.p,{children:"To disable an incompatible metric, either remove that metric from the metrics file or configure the metric so it does not apply the affected database:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-toml",children:"[[metric]]\ncontext = \"process\"\nlabels = [ \"inst_id\" ]\nmetricsdesc = { count=\"Gauge metric with count of processes.\" }\nrequest = '''\nselect inst_id, count(*) as count\nfrom gv$process\ngroup by inst_id\n'''\n# Set databases to an empty array to disable the metric entirely,\n# or include only compatible databases in this array.\ndatabases = []\n"})})]})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>r,x:()=>o});var n=s(6540);const i={},a=n.createContext(i);function r(e){const t=n.useContext(a);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/6c3adccd.f125177d.js b/docs/assets/js/6c3adccd.f125177d.js deleted file mode 100644 index 8e0de38b..00000000 --- a/docs/assets/js/6c3adccd.f125177d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[7316],{2706:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"advanced/older-versions","title":"Compatibility with Older Database Versions","description":"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.","source":"@site/docs/advanced/older-versions.md","sourceDirName":"advanced","slug":"/advanced/older-versions","permalink":"/oracle-db-appdev-monitoring/docs/next/advanced/older-versions","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/advanced/older-versions.md","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"title":"Compatibility with Older Database Versions","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Development","permalink":"/oracle-db-appdev-monitoring/docs/next/advanced/development"},"next":{"title":"Releases","permalink":"/oracle-db-appdev-monitoring/docs/next/category/releases"}}');var i=t(4848),a=t(8453);const r={title:"Compatibility with Older Database Versions",sidebar_position:4},o="Older Database Versions",d={},l=[{value:"Known Issues with Older Database Versions",id:"known-issues-with-older-database-versions",level:3},{value:"Disabling incompatible metrics",id:"disabling-incompatible-metrics",level:2}];function c(e){const s={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"older-database-versions",children:"Older Database Versions"})}),"\n",(0,i.jsx)(s.p,{children:"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database."}),"\n",(0,i.jsx)(s.h3,{id:"known-issues-with-older-database-versions",children:"Known Issues with Older Database Versions"}),"\n",(0,i.jsx)(s.p,{children:"If you are running an unsupported version of Oracle Database, you may encounter the following issues:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Metrics using modern SQL syntax may not work. For compatibility, you can disable or modify these metrics."}),"\n",(0,i.jsx)(s.li,{children:'The exporter uses a "thick" database client. Ensure your database client libraries are compatible with your database version.'}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"disabling-incompatible-metrics",children:"Disabling incompatible metrics"}),"\n",(0,i.jsx)(s.p,{children:"To disable an incompatible metric, either remove that metric from the metrics file or configure the metric so it does not apply the affected database:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-toml",children:"[[metric]]\ncontext = \"process\"\nlabels = [ \"inst_id\" ]\nmetricsdesc = { count=\"Gauge metric with count of processes.\" }\nrequest = '''\nselect inst_id, count(*) as count\nfrom gv$process\ngroup by inst_id\n'''\n# Set databases to an empty array to disable the metric entirely,\n# or include only compatible databases in this array.\ndatabases = []\n"})})]})}function p(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>o});var n=t(6540);const i={},a=n.createContext(i);function r(e){const s=n.useContext(a);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/6d843586.7b54b42d.js b/docs/assets/js/6d843586.7b54b42d.js new file mode 100644 index 00000000..67024931 --- /dev/null +++ b/docs/assets/js/6d843586.7b54b42d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[2227],{3454:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Getting Started","description":"Learn the most important Oracle Database Metrics Exporter concepts.","slug":"/category/getting-started","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/getting-started","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"OpenTelemetry Metrics for Oracle Database","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/intro"},"next":{"title":"Installation","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/basics"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/6f6f2b68.bd5de5f9.js b/docs/assets/js/6f6f2b68.bd5de5f9.js new file mode 100644 index 00000000..0f22588e --- /dev/null +++ b/docs/assets/js/6f6f2b68.bd5de5f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6233],{5902:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"2.2.0","label":"2.2.0","banner":null,"badge":true,"noIndex":false,"className":"docs-version-2.2.0","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"OpenTelemetry Metrics for Oracle Database","href":"/oracle-db-appdev-monitoring/docs/intro","docId":"intro","unlisted":false},{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Installation","href":"/oracle-db-appdev-monitoring/docs/getting-started/basics","docId":"getting-started/basics","unlisted":false},{"type":"link","label":"Default Metrics","href":"/oracle-db-appdev-monitoring/docs/getting-started/default-metrics","docId":"getting-started/default-metrics","unlisted":false},{"type":"link","label":"Kubernetes","href":"/oracle-db-appdev-monitoring/docs/getting-started/kubernetes","docId":"getting-started/kubernetes","unlisted":false},{"type":"link","label":"Grafana Dashboards","href":"/oracle-db-appdev-monitoring/docs/getting-started/grafana-dashboards","docId":"getting-started/grafana-dashboards","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/category/getting-started"},{"type":"category","label":"Configuration","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Exporter Configuration","href":"/oracle-db-appdev-monitoring/docs/configuration/config-file","docId":"configuration/config-file","unlisted":false},{"type":"link","label":"Custom Metrics","href":"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics","docId":"configuration/custom-metrics","unlisted":false},{"type":"link","label":"Multiple Databases","href":"/oracle-db-appdev-monitoring/docs/configuration/multiple-databases","docId":"configuration/multiple-databases","unlisted":false},{"type":"link","label":"Oracle Wallet (mTLS)","href":"/oracle-db-appdev-monitoring/docs/configuration/oracle-wallet","docId":"configuration/oracle-wallet","unlisted":false},{"type":"link","label":"Alert Logs","href":"/oracle-db-appdev-monitoring/docs/configuration/alert-logs","docId":"configuration/alert-logs","unlisted":false},{"type":"link","label":"OCI Vault","href":"/oracle-db-appdev-monitoring/docs/configuration/oci-vault","docId":"configuration/oci-vault","unlisted":false},{"type":"link","label":"Azure Vault","href":"/oracle-db-appdev-monitoring/docs/configuration/azure-vault","docId":"configuration/azure-vault","unlisted":false},{"type":"link","label":"HashiCorp Vault","href":"/oracle-db-appdev-monitoring/docs/configuration/hashicorp-vault","docId":"configuration/hashicorp-vault","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/category/configuration"},{"type":"category","label":"Advanced","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuring the Go Runtime","href":"/oracle-db-appdev-monitoring/docs/advanced/go-runtime","docId":"advanced/go-runtime","unlisted":false},{"type":"link","label":"Monitoring TxEventQ","href":"/oracle-db-appdev-monitoring/docs/advanced/txeventq","docId":"advanced/txeventq","unlisted":false},{"type":"link","label":"Development","href":"/oracle-db-appdev-monitoring/docs/advanced/development","docId":"advanced/development","unlisted":false},{"type":"link","label":"Compatibility with Older Database Versions","href":"/oracle-db-appdev-monitoring/docs/advanced/older-versions","docId":"advanced/older-versions","unlisted":false},{"type":"link","label":"go-ora Driver","href":"/oracle-db-appdev-monitoring/docs/advanced/go-ora","docId":"advanced/go-ora","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/category/advanced"},{"type":"category","label":"Releases","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Roadmap","href":"/oracle-db-appdev-monitoring/docs/releases/roadmap","docId":"releases/roadmap","unlisted":false},{"type":"link","label":"Changelog","href":"/oracle-db-appdev-monitoring/docs/releases/changelog","docId":"releases/changelog","unlisted":false},{"type":"link","label":"Builds","href":"/oracle-db-appdev-monitoring/docs/releases/builds","docId":"releases/builds","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/category/releases"}]},"docs":{"advanced/development":{"id":"advanced/development","title":"Development","description":"The exporter is a Go program using the Prometheus SDK.","sidebar":"tutorialSidebar"},"advanced/go-ora":{"id":"advanced/go-ora","title":"go-ora Driver","description":"The Oracle Database Metrics Exporter experimentally supports compiling with the go-ora database driver. By default, the exporter compiles using the godror database driver, which uses CGO execution to invoke Oracle Instant Client. the go-ora driver presents an option for users who want to use a \\"thin\\" database client without the Oracle Instant Client and CGO.","sidebar":"tutorialSidebar"},"advanced/go-runtime":{"id":"advanced/go-runtime","title":"Configuring the Go Runtime","description":"If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter\'s usage of memory.","sidebar":"tutorialSidebar"},"advanced/older-versions":{"id":"advanced/older-versions","title":"Compatibility with Older Database Versions","description":"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.","sidebar":"tutorialSidebar"},"advanced/txeventq":{"id":"advanced/txeventq","title":"Monitoring TxEventQ","description":"Oracle Transactional Event Queues (\\"TxEventQ\\") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.","sidebar":"tutorialSidebar"},"configuration/alert-logs":{"id":"configuration/alert-logs","title":"Alert Logs","description":"Collect export alert logs with a log ingestion tool.","sidebar":"tutorialSidebar"},"configuration/azure-vault":{"id":"configuration/azure-vault","title":"Azure Vault","description":"Securely load database credentials from Azure Vault.","sidebar":"tutorialSidebar"},"configuration/config-file":{"id":"configuration/config-file","title":"Exporter Configuration","description":"The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.","sidebar":"tutorialSidebar"},"configuration/custom-metrics":{"id":"configuration/custom-metrics","title":"Custom Metrics","description":"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.","sidebar":"tutorialSidebar"},"configuration/hashicorp-vault":{"id":"configuration/hashicorp-vault","title":"HashiCorp Vault","description":"Securely load database credentials from HashiCorp Vault.","sidebar":"tutorialSidebar"},"configuration/multiple-databases":{"id":"configuration/multiple-databases","title":"Multiple Databases","description":"The exporter may be configured to scrape as many databases as needed.","sidebar":"tutorialSidebar"},"configuration/oci-vault":{"id":"configuration/oci-vault","title":"OCI Vault","description":"Securely load database credentials from OCI Vault.","sidebar":"tutorialSidebar"},"configuration/oracle-wallet":{"id":"configuration/oracle-wallet","title":"Oracle Wallet (mTLS)","description":"For mutual TLS (mTLS) connections, you must use an Oracle Wallet.","sidebar":"tutorialSidebar"},"getting-started/basics":{"id":"getting-started/basics","title":"Installation","description":"In this section you will find information on running the exporter.","sidebar":"tutorialSidebar"},"getting-started/default-metrics":{"id":"getting-started/default-metrics","title":"Default Metrics","description":"The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.","sidebar":"tutorialSidebar"},"getting-started/grafana-dashboards":{"id":"getting-started/grafana-dashboards","title":"Grafana Dashboards","description":"Sample Grafana dashboards are included with the exporter.","sidebar":"tutorialSidebar"},"getting-started/kubernetes":{"id":"getting-started/kubernetes","title":"Kubernetes","description":"You can run the exporter in Kubernetes using provided manifests.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"OpenTelemetry Metrics for Oracle Database","description":"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.","sidebar":"tutorialSidebar"},"releases/builds":{"id":"releases/builds","title":"Builds","description":"The Oracle Database Metrics Exporter publishes cross-platform builds for each release.","sidebar":"tutorialSidebar"},"releases/changelog":{"id":"releases/changelog","title":"Changelog","description":"List of upcoming and historic changes to the exporter.","sidebar":"tutorialSidebar"},"releases/roadmap":{"id":"releases/roadmap","title":"Roadmap","description":"Planned and upcoming features for the exporter.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/6f6f2b68.c409f929.js b/docs/assets/js/6f6f2b68.c409f929.js deleted file mode 100644 index 2b2c8812..00000000 --- a/docs/assets/js/6f6f2b68.c409f929.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6233],{5902:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"2.1.0","label":"2.1.0","banner":null,"badge":true,"noIndex":false,"className":"docs-version-2.1.0","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"OpenTelemetry Metrics for Oracle Database","href":"/oracle-db-appdev-monitoring/docs/intro","docId":"intro","unlisted":false},{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Installation","href":"/oracle-db-appdev-monitoring/docs/getting-started/basics","docId":"getting-started/basics","unlisted":false},{"type":"link","label":"Default Metrics","href":"/oracle-db-appdev-monitoring/docs/getting-started/default-metrics","docId":"getting-started/default-metrics","unlisted":false},{"type":"link","label":"Kubernetes","href":"/oracle-db-appdev-monitoring/docs/getting-started/kubernetes","docId":"getting-started/kubernetes","unlisted":false},{"type":"link","label":"Grafana Dashboards","href":"/oracle-db-appdev-monitoring/docs/getting-started/grafana-dashboards","docId":"getting-started/grafana-dashboards","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/category/getting-started"},{"type":"category","label":"Configuration","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Exporter Configuration","href":"/oracle-db-appdev-monitoring/docs/configuration/config-file","docId":"configuration/config-file","unlisted":false},{"type":"link","label":"Custom Metrics","href":"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics","docId":"configuration/custom-metrics","unlisted":false},{"type":"link","label":"Multiple Databases","href":"/oracle-db-appdev-monitoring/docs/configuration/multiple-databases","docId":"configuration/multiple-databases","unlisted":false},{"type":"link","label":"Oracle Wallet (mTLS)","href":"/oracle-db-appdev-monitoring/docs/configuration/oracle-wallet","docId":"configuration/oracle-wallet","unlisted":false},{"type":"link","label":"Alert Logs","href":"/oracle-db-appdev-monitoring/docs/configuration/alert-logs","docId":"configuration/alert-logs","unlisted":false},{"type":"link","label":"OCI Vault","href":"/oracle-db-appdev-monitoring/docs/configuration/oci-vault","docId":"configuration/oci-vault","unlisted":false},{"type":"link","label":"Azure Vault","href":"/oracle-db-appdev-monitoring/docs/configuration/azure-vault","docId":"configuration/azure-vault","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/category/configuration"},{"type":"category","label":"Advanced","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuring the Go Runtime","href":"/oracle-db-appdev-monitoring/docs/advanced/go-runtime","docId":"advanced/go-runtime","unlisted":false},{"type":"link","label":"Monitoring TxEventQ","href":"/oracle-db-appdev-monitoring/docs/advanced/txeventq","docId":"advanced/txeventq","unlisted":false},{"type":"link","label":"Development","href":"/oracle-db-appdev-monitoring/docs/advanced/development","docId":"advanced/development","unlisted":false},{"type":"link","label":"Compatibility with Older Database Versions","href":"/oracle-db-appdev-monitoring/docs/advanced/older-versions","docId":"advanced/older-versions","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/category/advanced"},{"type":"category","label":"Releases","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Roadmap","href":"/oracle-db-appdev-monitoring/docs/releases/roadmap","docId":"releases/roadmap","unlisted":false},{"type":"link","label":"Changelog","href":"/oracle-db-appdev-monitoring/docs/releases/changelog","docId":"releases/changelog","unlisted":false},{"type":"link","label":"Builds","href":"/oracle-db-appdev-monitoring/docs/releases/builds","docId":"releases/builds","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/category/releases"}]},"docs":{"advanced/development":{"id":"advanced/development","title":"Development","description":"The exporter is a Go program using the Prometheus SDK.","sidebar":"tutorialSidebar"},"advanced/go-runtime":{"id":"advanced/go-runtime","title":"Configuring the Go Runtime","description":"If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter\'s usage of memory.","sidebar":"tutorialSidebar"},"advanced/older-versions":{"id":"advanced/older-versions","title":"Compatibility with Older Database Versions","description":"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.","sidebar":"tutorialSidebar"},"advanced/txeventq":{"id":"advanced/txeventq","title":"Monitoring TxEventQ","description":"Oracle Transactional Event Queues (\\"TxEventQ\\") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.","sidebar":"tutorialSidebar"},"configuration/alert-logs":{"id":"configuration/alert-logs","title":"Alert Logs","description":"Collect export alert logs with a log ingestion tool.","sidebar":"tutorialSidebar"},"configuration/azure-vault":{"id":"configuration/azure-vault","title":"Azure Vault","description":"Securely load database credentials from Azure Vault.","sidebar":"tutorialSidebar"},"configuration/config-file":{"id":"configuration/config-file","title":"Exporter Configuration","description":"The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.","sidebar":"tutorialSidebar"},"configuration/custom-metrics":{"id":"configuration/custom-metrics","title":"Custom Metrics","description":"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.","sidebar":"tutorialSidebar"},"configuration/multiple-databases":{"id":"configuration/multiple-databases","title":"Multiple Databases","description":"The exporter may be configured to scrape as many databases as needed.","sidebar":"tutorialSidebar"},"configuration/oci-vault":{"id":"configuration/oci-vault","title":"OCI Vault","description":"Securely load database credentials from OCI Vault.","sidebar":"tutorialSidebar"},"configuration/oracle-wallet":{"id":"configuration/oracle-wallet","title":"Oracle Wallet (mTLS)","description":"For mutual TLS (mTLS) connections, you must use an Oracle Wallet.","sidebar":"tutorialSidebar"},"getting-started/basics":{"id":"getting-started/basics","title":"Installation","description":"In this section you will find information on running the exporter.","sidebar":"tutorialSidebar"},"getting-started/default-metrics":{"id":"getting-started/default-metrics","title":"Default Metrics","description":"The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.","sidebar":"tutorialSidebar"},"getting-started/grafana-dashboards":{"id":"getting-started/grafana-dashboards","title":"Grafana Dashboards","description":"Sample Grafana dashboards are included with the exporter.","sidebar":"tutorialSidebar"},"getting-started/kubernetes":{"id":"getting-started/kubernetes","title":"Kubernetes","description":"You can run the exporter in Kubernetes using provided manifests.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"OpenTelemetry Metrics for Oracle Database","description":"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.","sidebar":"tutorialSidebar"},"releases/builds":{"id":"releases/builds","title":"Builds","description":"The Oracle Database Metrics Exporter publishes cross-platform builds for each release.","sidebar":"tutorialSidebar"},"releases/changelog":{"id":"releases/changelog","title":"Changelog","description":"List of upcoming and historic changes to the exporter.","sidebar":"tutorialSidebar"},"releases/roadmap":{"id":"releases/roadmap","title":"Roadmap","description":"Planned and upcoming features for the exporter.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/7f6dc23e.2cc91e91.js b/docs/assets/js/7f6dc23e.2cc91e91.js new file mode 100644 index 00000000..b0c5309c --- /dev/null +++ b/docs/assets/js/7f6dc23e.2cc91e91.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3469],{4434:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Advanced","description":"Advanced configuration.","slug":"/category/advanced","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/advanced","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Azure Vault","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/azure-vault"},"next":{"title":"Configuring the Go Runtime","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/go-runtime"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/85a0f18d.3710d60b.js b/docs/assets/js/85a0f18d.3710d60b.js deleted file mode 100644 index 36bd1fc0..00000000 --- a/docs/assets/js/85a0f18d.3710d60b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[8918],{5405:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"configuration/azure-vault","title":"Azure Vault","description":"Securely load database credentials from Azure Vault.","source":"@site/docs/configuration/azure-vault.md","sourceDirName":"configuration","slug":"/configuration/azure-vault","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/azure-vault","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/configuration/azure-vault.md","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"Azure Vault","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"OCI Vault","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/oci-vault"},"next":{"title":"Advanced","permalink":"/oracle-db-appdev-monitoring/docs/next/category/advanced"}}');var r=n(4848),i=n(8453);const o={title:"Azure Vault",sidebar_position:7},s="Azure Vault",u={},c=[{value:"Authentication",id:"authentication",level:3},{value:"Azure Vault CLI Configuration (without exporter config file)",id:"azure-vault-cli-configuration-without-exporter-config-file",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"azure-vault",children:"Azure Vault"})}),"\n",(0,r.jsx)(t.p,{children:"Securely load database credentials from Azure Vault."}),"\n",(0,r.jsxs)(t.p,{children:["Each database in the config file may be configured to use Azure Vault. To load the database username and/or password from Azure Vault, set the ",(0,r.jsx)(t.code,{children:"vault.azure"})," property to contain the Azure Vault ID, and secret names for the database username/password:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n azure:\n id: \n usernameSecret: \n passwordSecret: \n"})}),"\n",(0,r.jsx)(t.h3,{id:"authentication",children:"Authentication"}),"\n",(0,r.jsxs)(t.p,{children:["If you are running the exporter outside Azure, we recommend using ",(0,r.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/developer/go/sdk/authentication/authentication-on-premises-apps",children:"application service principal"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["If you are running the exporter inside Azure, we recommend using a ",(0,r.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/developer/go/sdk/authentication/authentication-azure-hosted-apps",children:"managed identity"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"You should set the following additional environment variables to allow the exporter to authenticate to Azure:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_TENANT_ID"})," should be set to your tenant ID"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_CLIENT_ID"})," should be set to the client ID to authenticate to Azure"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_CLIENT_SECRET"})," should be set to the client secret to authenticate to Azure"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"azure-vault-cli-configuration-without-exporter-config-file",children:"Azure Vault CLI Configuration (without exporter config file)"}),"\n",(0,r.jsx)(t.p,{children:"If using the default database with CLI parameters, the exporter will read the database username and password from secrets stored in Azure Key Vault if you set these environment variables:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_ID"})," should be set to the ID of the Azure Key Vault that you wish to use"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_USERNAME_SECRET"})," should be set to the name of the secret in the Azure Key Vault which contains the database username"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_PASSWORD_SECRET"})," should be set to the name of the secret in the Azure Key Vault which contains the database password"]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var a=n(6540);const r={},i=a.createContext(r);function o(e){const t=a.useContext(i);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/85a0f18d.71aaa2b4.js b/docs/assets/js/85a0f18d.71aaa2b4.js new file mode 100644 index 00000000..8d1d0e45 --- /dev/null +++ b/docs/assets/js/85a0f18d.71aaa2b4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[8918],{5405:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"configuration/azure-vault","title":"Azure Vault","description":"Securely load database credentials from Azure Vault.","source":"@site/docs/configuration/azure-vault.md","sourceDirName":"configuration","slug":"/configuration/azure-vault","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/azure-vault","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/configuration/azure-vault.md","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"Azure Vault","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"OCI Vault","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/oci-vault"},"next":{"title":"HashiCorp Vault","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/hashicorp-vault"}}');var r=n(4848),i=n(8453);const o={title:"Azure Vault",sidebar_position:7},s="Azure Vault",u={},l=[{value:"Authentication",id:"authentication",level:3},{value:"Azure Vault CLI Configuration (without exporter config file)",id:"azure-vault-cli-configuration-without-exporter-config-file",level:3}];function c(e){const t={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"azure-vault",children:"Azure Vault"})}),"\n",(0,r.jsx)(t.p,{children:"Securely load database credentials from Azure Vault."}),"\n",(0,r.jsxs)(t.p,{children:["Each database in the config file may be configured to use Azure Vault. To load the database username and/or password from Azure Vault, set the ",(0,r.jsx)(t.code,{children:"vault.azure"})," property to contain the Azure Vault ID, and secret names for the database username/password:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n azure:\n id: \n usernameSecret: \n passwordSecret: \n"})}),"\n",(0,r.jsx)(t.h3,{id:"authentication",children:"Authentication"}),"\n",(0,r.jsxs)(t.p,{children:["If you are running the exporter outside Azure, we recommend using ",(0,r.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/developer/go/sdk/authentication/authentication-on-premises-apps",children:"application service principal"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["If you are running the exporter inside Azure, we recommend using a ",(0,r.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/developer/go/sdk/authentication/authentication-azure-hosted-apps",children:"managed identity"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"You should set the following additional environment variables to allow the exporter to authenticate to Azure:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_TENANT_ID"})," should be set to your tenant ID"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_CLIENT_ID"})," should be set to the client ID to authenticate to Azure"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_CLIENT_SECRET"})," should be set to the client secret to authenticate to Azure"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"azure-vault-cli-configuration-without-exporter-config-file",children:"Azure Vault CLI Configuration (without exporter config file)"}),"\n",(0,r.jsx)(t.p,{children:"If using the default database with CLI parameters, the exporter will read the database username and password from secrets stored in Azure Key Vault if you set these environment variables:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_ID"})," should be set to the ID of the Azure Key Vault that you wish to use"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_USERNAME_SECRET"})," should be set to the name of the secret in the Azure Key Vault which contains the database username"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_PASSWORD_SECRET"})," should be set to the name of the secret in the Azure Key Vault which contains the database password"]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var a=n(6540);const r={},i=a.createContext(r);function o(e){const t=a.useContext(i);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8e529663.cd5d845c.js b/docs/assets/js/8e529663.cd5d845c.js new file mode 100644 index 00000000..0dbdb963 --- /dev/null +++ b/docs/assets/js/8e529663.cd5d845c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6143],{8453:(e,a,t)=>{t.d(a,{R:()=>o,x:()=>i});var n=t(6540);const r={},s=n.createContext(r);function o(e){const a=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function i(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(s.Provider,{value:a},e.children)}},9549:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"configuration/hashicorp-vault","title":"HashiCorp Vault","description":"Securely load database credentials from HashiCorp Vault.","source":"@site/versioned_docs/version-2.2.0/configuration/hashicorp-vault.md","sourceDirName":"configuration","slug":"/configuration/hashicorp-vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/hashicorp-vault","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/configuration/hashicorp-vault.md","tags":[],"version":"2.2.0","sidebarPosition":8,"frontMatter":{"title":"HashiCorp Vault","sidebar_position":8},"sidebar":"tutorialSidebar","previous":{"title":"Azure Vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/azure-vault"},"next":{"title":"Advanced","permalink":"/oracle-db-appdev-monitoring/docs/category/advanced"}}');var r=t(4848),s=t(8453);const o={title:"HashiCorp Vault",sidebar_position:8},i="HashiCorp Vault",l={},c=[{value:"Dynamic database credentials",id:"dynamic-database-credentials",level:3},{value:"Authentication",id:"authentication",level:3}];function d(e){const a={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.header,{children:(0,r.jsx)(a.h1,{id:"hashicorp-vault",children:"HashiCorp Vault"})}),"\n",(0,r.jsx)(a.p,{children:"Securely load database credentials from HashiCorp Vault."}),"\n",(0,r.jsxs)(a.p,{children:["Each database in the config file may be configured to use HashiCorp Vault. To load the database username and/or password from HashiCorp Vault, set the ",(0,r.jsx)(a.code,{children:"vault.hashicorp"})," property to contain the following information:"]}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-yaml",children:'databases:\n mydb:\n vault:\n hashicorp:\n proxySocket: /var/run/vault/vault.sock\n mountType: "kvv1", "kvv2", "database" or "logical"\n mountName: secret engine mount path\n secretPath: path of the secret or database role name\n usernameAttribute: name of the JSON attribute, where to read the database username, if ommitted defaults to "username"\n passwordAttribute: name of the JSON attribute, where to read the database password, if ommitted defaults to "password"\n'})}),"\n",(0,r.jsx)(a.p,{children:"Example"}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n hashicorp:\n proxySocket: /var/run/vault/vault.sock\n mountType: kvv2\n mountName: dev\n secretPath: oracle/mydb/monitoring\n"})}),"\n",(0,r.jsx)(a.h3,{id:"dynamic-database-credentials",children:"Dynamic database credentials"}),"\n",(0,r.jsx)(a.p,{children:"Instead of fixed database credentials Vault also supports dynamic credentials that are created every time application requests them. This\nmakes sure the credentials always have a short time-to-live and even if they leak, they quickly become invalid."}),"\n",(0,r.jsxs)(a.p,{children:["Follow ",(0,r.jsx)(a.a,{href:"https://developer.hashicorp.com/vault/docs/secrets/databases/oracle",children:"Vault documentation on how to set up Oracle database plugin for Vault"}),"."]}),"\n",(0,r.jsx)(a.p,{children:"A few additional notes about connecting exporter to CDB. NB! Below are just example commands, adjust them to fit your environment."}),"\n",(0,r.jsx)(a.p,{children:'When setting up connection to CDB, then also need to edit "username_template" parameter, so Vault would create a C## common user for exporter.'}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-sh",children:'vault write database/config/mydb \\\n plugin_name=vault-plugin-database-oracle \\\n allowed_roles="mydb_exporter" \\\n connection_url=\'{{username}}/{{password}}@//172.17.0.3:1521/FREE\' \\\n username_template=\'{{ printf "C##V_%s_%s_%s_%s" (.DisplayName | truncate 8) (.RoleName | truncate 8) (random 20) (unix_time) | truncate 30 | uppercase | replace "-" "_" | replace "." "_" }}\' \\\n username=\'c##vaultadmin\' \\\n password=\'vaultadmin\'\n'})}),"\n",(0,r.jsx)(a.p,{children:"Since Vault is creating common users in CDB, it needs to have CREATE/ALTER/DROP USER privileges on all containers. Here is a modification of the documented Vault Oracle plugin admin user privileges."}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-sql",children:"GRANT CREATE USER to c##vaultadmin WITH ADMIN OPTION container=all;\nGRANT ALTER USER to c##vaultadmin WITH ADMIN OPTION container=all;\nGRANT DROP USER to c##vaultadmin WITH ADMIN OPTION container=all;\nGRANT CREATE SESSION to c##vaultadmin WITH ADMIN OPTION;\nGRANT SELECT on gv_$session to c##vaultadmin;\nGRANT SELECT on v_$sql to c##vaultadmin;\nGRANT ALTER SYSTEM to c##vaultadmin WITH ADMIN OPTION;\n"})}),"\n",(0,r.jsx)(a.p,{children:"Create no authentication user in Oracle database, that has actual monitoring privileges."}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-sql",children:"CREATE USER c##exporter NO AUTHENTICATION;\nGRANT create session TO c##exporter;\nGRANT all necessary privileges that Exporter needs TO c##exporter;\n"})}),"\n",(0,r.jsx)(a.p,{children:"Create database role in Vault:"}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-sh",children:'vault write database/roles/mydb_exporter \\\n db_name=mydb \\\n creation_statements=\'CREATE USER {{username}} IDENTIFIED BY "{{password}}"; GRANT CREATE SESSION TO {{username}}; ALTER USER c##exporter GRANT CONNECT THROUGH {{username}};\' \\\n default_ttl="7d" \\\n max_ttl="10d"\n'})}),"\n",(0,r.jsx)(a.p,{children:"NB! Make sure to restart Exporter before TTL above expires, this will fetch new database credentials. When TTL expires, Vault will drop the dynamically created database users."}),"\n",(0,r.jsx)(a.p,{children:"And create database config in Exporter:"}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n hashicorp:\n proxySocket: /var/run/vault/vault.sock\n mountType: database\n mountName: database\n secretPath: mydb_exporter\n useAsProxyFor: c##exporter\n"})}),"\n",(0,r.jsx)(a.h3,{id:"authentication",children:"Authentication"}),"\n",(0,r.jsx)(a.p,{children:"In this first version it currently only supports queries via HashiCorp Vault Proxy configured to run on the local host and listening on a Unix socket. Currently also required use_auto_auth_token option to be set.\nWill expand the support for other methods in the future."}),"\n",(0,r.jsx)(a.p,{children:"Example Vault Proxy configuration snippet:"}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{children:'listener "unix" {\n address = "/var/run/vault/vault.sock"\n socket_mode = "0660"\n socket_user = "vault"\n socket_group = "vaultaccess"\n tls_disable = true\n}\n\napi_proxy {\n # This always uses the auto_auth token when communicating with Vault server, even if client does not send a token\n use_auto_auth_token = true\n}\n'})})]})}function u(e={}){const{wrapper:a}={...(0,s.R)(),...e.components};return a?(0,r.jsx)(a,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/cb6f8875.bd27ec5b.js b/docs/assets/js/97b85da1.441d7c54.js similarity index 98% rename from docs/assets/js/cb6f8875.bd27ec5b.js rename to docs/assets/js/97b85da1.441d7c54.js index 36ada716..767f03cb 100644 --- a/docs/assets/js/cb6f8875.bd27ec5b.js +++ b/docs/assets/js/97b85da1.441d7c54.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[1412],{7804:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"getting-started/basics","title":"Installation","description":"In this section you will find information on running the exporter.","source":"@site/versioned_docs/version-2.1.0/getting-started/basics.md","sourceDirName":"getting-started","slug":"/getting-started/basics","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/getting-started/basics.md","tags":[],"version":"2.1.0","sidebarPosition":1,"frontMatter":{"title":"Installation","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/oracle-db-appdev-monitoring/docs/category/getting-started"},"next":{"title":"Default Metrics","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/default-metrics"}}');var a=t(4848),s=t(8453);const i={title:"Installation",sidebar_position:1},r="Installation",l={},c=[{value:"Database Permissions",id:"database-permissions",level:2},{value:"Docker, Podman, etc",id:"docker-podman-etc",level:2},{value:"Oracle Database Free",id:"oracle-database-free",level:3},{value:"Exporter",id:"exporter",level:3},{value:"Simple connection",id:"simple-connection",level:3},{value:"Standalone Binary",id:"standalone-binary",level:2},{value:"Docker Compose",id:"docker-compose",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"installation",children:"Installation"})}),"\n",(0,a.jsx)(n.p,{children:"In this section you will find information on running the exporter."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["In a container runtime like ",(0,a.jsx)(n.a,{href:"#docker-podman-etc",children:"Docker, Podman, etc"})]}),"\n",(0,a.jsxs)(n.li,{children:["In a test/demo environment using ",(0,a.jsx)(n.a,{href:"#docker-compose",children:"Docker Compose"})]}),"\n",(0,a.jsxs)(n.li,{children:["In ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/getting-started/kubernetes",children:"Kubernetes"})]}),"\n",(0,a.jsxs)(n.li,{children:["As a ",(0,a.jsx)(n.a,{href:"#standalone-binary",children:"standalone binary"})]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"database-permissions",children:"Database Permissions"}),"\n",(0,a.jsxs)(n.p,{children:["For the built-in default metrics, the exporter database database user must have the ",(0,a.jsx)(n.code,{children:"SELECT_CATALOG_ROLE"})," privilege and/or ",(0,a.jsx)(n.code,{children:"SELECT"})," permission on the following objects:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"dba_tablespace_usage_metrics\ndba_tablespaces\ngv$system_wait_class\ngv$asm_diskgroup_stat\ngv$datafile\ngv$sysstat\ngv$process\ngv$waitclassmetric\ngv$session\ngv$resource_limit\ngv$parameter\ngv$database\ngv$sqlstats\ngv$sysmetric\nv$diag_alert_ext (for alert logs only)\n"})}),"\n",(0,a.jsx)(n.h2,{id:"docker-podman-etc",children:"Docker, Podman, etc"}),"\n",(0,a.jsxs)(n.p,{children:["You can run the exporter in a local container using a container image from ",(0,a.jsx)(n.a,{href:"https://container-registry.oracle.com",children:"Oracle Container Registry"}),'. The container image is available in the "observability-exporter" repository in the "Database" category. No authentication or license presentment/acceptance are required to pull this image from the registry.']}),"\n",(0,a.jsx)(n.h3,{id:"oracle-database-free",children:"Oracle Database Free"}),"\n",(0,a.jsxs)(n.p,{children:["If you need an Oracle Database to test the exporter, you can use this command to start up an instance of ",(0,a.jsx)(n.a,{href:"https://www.oracle.com/database/free/",children:"Oracle Database Free"})," which also requires no authentication or license presentment/acceptance to pull the image."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker run --name free23ai \\\n -d \\\n -p 1521:1521 \\\n -e ORACLE_PASSWORD=Welcome12345 \\\n gvenzl/oracle-free:23.9-slim-faststart\n"})}),"\n",(0,a.jsx)(n.p,{children:'This will pull the image and start up the database with a listener on port 1521. It will also create a pluggable database (a database container) called "FREEPDB1" and will set the admin passwords to the password you specified on this command.'}),"\n",(0,a.jsx)(n.p,{children:"You can tail the logs to see when the database is ready to use:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker logs -f free23ai\n\n(look for this message...)\n#########################\nDATABASE IS READY TO USE!\n#########################\n"})}),"\n",(0,a.jsx)(n.p,{children:'To obtain the IP address of the container, which you will need to connect to the database, use this command. Note: depending on your platform and container runtime, you may be able to access the database at "localhost":'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'docker inspect free23ai | grep IPA\n "SecondaryIPAddresses": null,\n "IPAddress": "172.17.0.2",\n "IPAMConfig": null,\n "IPAddress": "172.17.0.2",\n'})}),"\n",(0,a.jsx)(n.h3,{id:"exporter",children:"Exporter"}),"\n",(0,a.jsx)(n.p,{children:"You need to give the exporter the connection details for the Oracle Database that you want it to run against. You can use a simple connection, or a wallet."}),"\n",(0,a.jsx)(n.h3,{id:"simple-connection",children:"Simple connection"}),"\n",(0,a.jsx)(n.p,{children:"For a simple connection, you will provide the details using these variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_USERNAME"})," is the database username, e.g., ",(0,a.jsx)(n.code,{children:"pdbadmin"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_PASSWORD"})," is the password for that user, e.g., ",(0,a.jsx)(n.code,{children:"Welcome12345"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_CONNECT_STRING"})," is the connection string, e.g., ",(0,a.jsx)(n.code,{children:"free23ai:1521/freepdb"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_ROLE"})," (Optional) can be set to ",(0,a.jsx)(n.code,{children:"SYSDBA"}),", ",(0,a.jsx)(n.code,{children:"SYSOPER"}),", ",(0,a.jsx)(n.code,{children:"SYSBACKUP"}),", ",(0,a.jsx)(n.code,{children:"SYSDG"}),", ",(0,a.jsx)(n.code,{children:"SYSKM"}),", ",(0,a.jsx)(n.code,{children:"SYSRAC"})," or ",(0,a.jsx)(n.code,{children:"SYSASM"})," if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"To run the exporter in a container and expose the port, use a command like this, with the appropriate values for the environment variables:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker run -it --rm \\\n -e DB_USERNAME=pdbadmin \\\n -e DB_PASSWORD=Welcome12345 \\\n -e DB_CONNECT_STRING=free23ai:1521/freepdb \\\n -p 9161:9161 \\\n container-registry.oracle.com/database/observability-exporter:2.1.0\n"})}),"\n",(0,a.jsx)(n.h2,{id:"standalone-binary",children:"Standalone Binary"}),"\n",(0,a.jsxs)(n.p,{children:["Pre-compiled versions for Linux, ARM and Darwin 64-bit can be found under ",(0,a.jsx)(n.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/releases",children:"releases"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In order to run, you'll need the ",(0,a.jsx)(n.a,{href:"http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html",children:"Oracle Instant Client Basic"})," for your operating system. Only the basic version is required for the exporter."]}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["NOTE: If you are running the Standalone binary on a Mac ARM platform you must set the variable ",(0,a.jsx)(n.code,{children:"DYLD_LIBRARY_PATH"})," to the location of where the instant client installed. For example ",(0,a.jsx)(n.code,{children:"export DYLD_LIBRARY_PATH=/lib/oracle/instantclient_23_3"}),"."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The following command line arguments (flags) can be passed to the exporter (the --help flag will show the table below)."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'Usage of oracledb_exporter:\n --config.file="example-config.yaml"\n File with metrics exporter configuration. (env: CONFIG_FILE)\n --web.telemetry-path="/metrics"\n Path under which to expose metrics. (env: TELEMETRY_PATH)\n --default.metrics="default-metrics.toml"\n File with default metrics in a TOML file. (env: DEFAULT_METRICS)\n --custom.metrics="" Comma separated list of file(s) that contain various custom metrics in a TOML format. (env: CUSTOM_METRICS)\n --query.timeout=5 Query timeout (in seconds). (env: QUERY_TIMEOUT)\n --database.maxIdleConns=0 Number of maximum idle connections in the connection pool. (env: DATABASE_MAXIDLECONNS)\n --database.maxOpenConns=10\n Number of maximum open connections in the connection pool. (env: DATABASE_MAXOPENCONNS)\n --database.poolIncrement=-1\n Connection increment when the connection pool reaches max capacity. (env: DATABASE_POOLINCREMENT)\n --database.poolMaxConnections=-1\n Maximum number of connections in the connection pool. (env: DATABASE_POOLMAXCONNECTIONS)\n --database.poolMinConnections=-1\n Minimum number of connections in the connection pool. (env: DATABASE_POOLMINCONNECTIONS)\n --scrape.interval=0s Interval between each scrape. Default is to scrape on collect requests.\n --log.disable=0 Set to 1 to disable alert logs\n --log.interval=15s Interval between log updates (e.g. 5s).\n --log.destination="/log/alert.log"\n File to output the alert log to. (env: LOG_DESTINATION)\n --web.listen-address=:9161 ...\n Addresses on which to expose metrics and web interface. Repeatable for multiple addresses. Examples: `:9100` or `[::1]:9100` for http, `vsock://:9100` for vsock\n --web.config.file="" Path to configuration file that can enable TLS or authentication. See: https://github.com/prometheus/exporter-toolkit/blob/master/docs/web-configuration.md\n --log.level=info Only log messages with the given severity or above. One of: [debug, info, warn, error]\n --log.format=logfmt Output format of log messages. One of: [logfmt, json]\n --[no-]version Show application version.\n'})}),"\n",(0,a.jsx)(n.p,{children:"You may provide the connection details using these variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_USERNAME"})," is the database username, e.g., ",(0,a.jsx)(n.code,{children:"pdbadmin"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_PASSWORD"})," is the password for that user, e.g., ",(0,a.jsx)(n.code,{children:"Welcome12345"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_CONNECT_STRING"})," is the connection string, e.g., ",(0,a.jsx)(n.code,{children:"localhost:1521/freepdb1"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_ROLE"})," (Optional) can be set to ",(0,a.jsx)(n.code,{children:"SYSDBA"})," or ",(0,a.jsx)(n.code,{children:"SYSOPER"})," if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"ORACLE_HOME"})," is the location of the Oracle Instant Client, e.g., ",(0,a.jsx)(n.code,{children:"/lib/oracle/21/client64/lib"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"TNS_ADMIN"})," is the location of your (unzipped) wallet. The ",(0,a.jsx)(n.code,{children:"DIRECTORY"})," set in the ",(0,a.jsx)(n.code,{children:"sqlnet.ora"})," file must match the path that it will be mounted on inside the container."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The following example puts the logfile in the current location with the filename ",(0,a.jsx)(n.code,{children:"alert.log"})," and loads the default matrics file (",(0,a.jsx)(n.code,{children:"default-metrics,toml"}),") from the current location."]}),"\n",(0,a.jsxs)(n.p,{children:["If you prefer to provide configuration via a ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/config-file",children:"config file"}),", you may do so with the ",(0,a.jsx)(n.code,{children:"--config.file"}),' argument. The use of a config file over command line arguments is preferred. If a config file is not provided, the "default" database connection is managed by command line arguments.']}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n# If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,\n# \"$test$pwd\" => \"$$test$$pwd\"\n# Otherwise, the value will be expanded as an environment variable.\n\n# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n ## Database connection information for the \"default\" database.\n default:\n ## Database username\n username: ${DB_USERNAME}\n ## Database password\n password: ${DB_PASSWORD}\n ## Database password file\n ## If specified, will load the database password from a file.\n # passwordFile: ${DB_PASSWORD_FILE}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ## Arbitrary labels to add to each metric scraped from this database\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\nmetrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files\n custom:\n - custom-metrics-example/custom-metrics.toml\n\nlog:\n # Path of log file\n destination: /opt/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n\n# Optionally configure prometheus webserver\n#web:\n# listenAddresses: [':9161']\n# systemdSocket: true|false\n# configFile: /path/to/webconfigfile\n"})}),"\n",(0,a.jsx)(n.h3,{id:"docker-compose",children:"Docker Compose"}),"\n",(0,a.jsx)(n.p,{children:'If you would like to set up a test environment with the exporter, you can use the provided "Docker Compose" file in this repository which will start an Oracle Database instance, the exporter, Prometheus and Grafana.'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd docker-compose\ndocker-compose up -d\n"})}),"\n",(0,a.jsx)(n.p,{children:"The containers will take a short time to start. The first time, the Oracle container might take a few minutes to start while it creates the database instance, but this is a one-time operation, and subequent restarts will be much faster (a few seconds)."}),"\n",(0,a.jsx)(n.p,{children:"Once the containers are all running, you can access the services using these URLs:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"http://localhost:9161/metrics",children:"Exporter"})}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"http://localhost:9090",children:"Prometheus"}),' - try a query for "oracle".']}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"http://localhost:3000",children:"Grafana"}),' - username is "admin" and password is "grafana". An Oracle Database dashboard is provisioned and configured to use data from the exporter.']}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>r});var o=t(6540);const a={},s=o.createContext(a);function i(e){const n=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3456],{6932:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"getting-started/basics","title":"Installation","description":"In this section you will find information on running the exporter.","source":"@site/versioned_docs/version-2.2.0/getting-started/basics.md","sourceDirName":"getting-started","slug":"/getting-started/basics","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/getting-started/basics.md","tags":[],"version":"2.2.0","sidebarPosition":1,"frontMatter":{"title":"Installation","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/oracle-db-appdev-monitoring/docs/category/getting-started"},"next":{"title":"Default Metrics","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/default-metrics"}}');var a=t(4848),s=t(8453);const i={title:"Installation",sidebar_position:1},r="Installation",l={},c=[{value:"Database Permissions",id:"database-permissions",level:2},{value:"Docker, Podman, etc",id:"docker-podman-etc",level:2},{value:"Oracle Database Free",id:"oracle-database-free",level:3},{value:"Exporter",id:"exporter",level:3},{value:"Simple connection",id:"simple-connection",level:3},{value:"Standalone Binary",id:"standalone-binary",level:2},{value:"Docker Compose",id:"docker-compose",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"installation",children:"Installation"})}),"\n",(0,a.jsx)(n.p,{children:"In this section you will find information on running the exporter."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["In a container runtime like ",(0,a.jsx)(n.a,{href:"#docker-podman-etc",children:"Docker, Podman, etc"})]}),"\n",(0,a.jsxs)(n.li,{children:["In a test/demo environment using ",(0,a.jsx)(n.a,{href:"#docker-compose",children:"Docker Compose"})]}),"\n",(0,a.jsxs)(n.li,{children:["In ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/getting-started/kubernetes",children:"Kubernetes"})]}),"\n",(0,a.jsxs)(n.li,{children:["As a ",(0,a.jsx)(n.a,{href:"#standalone-binary",children:"standalone binary"})]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"database-permissions",children:"Database Permissions"}),"\n",(0,a.jsxs)(n.p,{children:["For the built-in default metrics, the exporter database database user must have the ",(0,a.jsx)(n.code,{children:"SELECT_CATALOG_ROLE"})," privilege and/or ",(0,a.jsx)(n.code,{children:"SELECT"})," permission on the following objects:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"dba_tablespace_usage_metrics\ndba_tablespaces\ngv$system_wait_class\ngv$asm_diskgroup_stat\ngv$datafile\ngv$sysstat\ngv$process\ngv$waitclassmetric\ngv$session\ngv$resource_limit\ngv$parameter\ngv$database\ngv$sqlstats\ngv$sysmetric\nv$diag_alert_ext (for alert logs only)\n"})}),"\n",(0,a.jsx)(n.h2,{id:"docker-podman-etc",children:"Docker, Podman, etc"}),"\n",(0,a.jsxs)(n.p,{children:["You can run the exporter in a local container using a container image from ",(0,a.jsx)(n.a,{href:"https://container-registry.oracle.com",children:"Oracle Container Registry"}),'. The container image is available in the "observability-exporter" repository in the "Database" category. No authentication or license presentment/acceptance are required to pull this image from the registry.']}),"\n",(0,a.jsx)(n.h3,{id:"oracle-database-free",children:"Oracle Database Free"}),"\n",(0,a.jsxs)(n.p,{children:["If you need an Oracle Database to test the exporter, you can use this command to start up an instance of ",(0,a.jsx)(n.a,{href:"https://www.oracle.com/database/free/",children:"Oracle Database Free"})," which also requires no authentication or license presentment/acceptance to pull the image."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker run --name free23ai \\\n -d \\\n -p 1521:1521 \\\n -e ORACLE_PASSWORD=Welcome12345 \\\n gvenzl/oracle-free:23.9-slim-faststart\n"})}),"\n",(0,a.jsx)(n.p,{children:'This will pull the image and start up the database with a listener on port 1521. It will also create a pluggable database (a database container) called "FREEPDB1" and will set the admin passwords to the password you specified on this command.'}),"\n",(0,a.jsx)(n.p,{children:"You can tail the logs to see when the database is ready to use:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker logs -f free23ai\n\n(look for this message...)\n#########################\nDATABASE IS READY TO USE!\n#########################\n"})}),"\n",(0,a.jsx)(n.p,{children:'To obtain the IP address of the container, which you will need to connect to the database, use this command. Note: depending on your platform and container runtime, you may be able to access the database at "localhost":'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'docker inspect free23ai | grep IPA\n "SecondaryIPAddresses": null,\n "IPAddress": "172.17.0.2",\n "IPAMConfig": null,\n "IPAddress": "172.17.0.2",\n'})}),"\n",(0,a.jsx)(n.h3,{id:"exporter",children:"Exporter"}),"\n",(0,a.jsx)(n.p,{children:"You need to give the exporter the connection details for the Oracle Database that you want it to run against. You can use a simple connection, or a wallet."}),"\n",(0,a.jsx)(n.h3,{id:"simple-connection",children:"Simple connection"}),"\n",(0,a.jsx)(n.p,{children:"For a simple connection, you will provide the details using these variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_USERNAME"})," is the database username, e.g., ",(0,a.jsx)(n.code,{children:"pdbadmin"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_PASSWORD"})," is the password for that user, e.g., ",(0,a.jsx)(n.code,{children:"Welcome12345"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_CONNECT_STRING"})," is the connection string, e.g., ",(0,a.jsx)(n.code,{children:"free23ai:1521/freepdb"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_ROLE"})," (Optional) can be set to ",(0,a.jsx)(n.code,{children:"SYSDBA"}),", ",(0,a.jsx)(n.code,{children:"SYSOPER"}),", ",(0,a.jsx)(n.code,{children:"SYSBACKUP"}),", ",(0,a.jsx)(n.code,{children:"SYSDG"}),", ",(0,a.jsx)(n.code,{children:"SYSKM"}),", ",(0,a.jsx)(n.code,{children:"SYSRAC"})," or ",(0,a.jsx)(n.code,{children:"SYSASM"})," if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"To run the exporter in a container and expose the port, use a command like this, with the appropriate values for the environment variables:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker run -it --rm \\\n -e DB_USERNAME=pdbadmin \\\n -e DB_PASSWORD=Welcome12345 \\\n -e DB_CONNECT_STRING=free23ai:1521/freepdb \\\n -p 9161:9161 \\\n container-registry.oracle.com/database/observability-exporter:2.2.0\n"})}),"\n",(0,a.jsx)(n.h2,{id:"standalone-binary",children:"Standalone Binary"}),"\n",(0,a.jsxs)(n.p,{children:["Pre-compiled versions for Linux, ARM and Darwin 64-bit can be found under ",(0,a.jsx)(n.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/releases",children:"releases"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In order to run, you'll need the ",(0,a.jsx)(n.a,{href:"http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html",children:"Oracle Instant Client Basic"})," for your operating system. Only the basic version is required for the exporter."]}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["NOTE: If you are running the Standalone binary on a Mac ARM platform you must set the variable ",(0,a.jsx)(n.code,{children:"DYLD_LIBRARY_PATH"})," to the location of where the instant client installed. For example ",(0,a.jsx)(n.code,{children:"export DYLD_LIBRARY_PATH=/lib/oracle/instantclient_23_3"}),"."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The following command line arguments (flags) can be passed to the exporter (the --help flag will show the table below)."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'Usage of oracledb_exporter:\n --config.file="example-config.yaml"\n File with metrics exporter configuration. (env: CONFIG_FILE)\n --web.telemetry-path="/metrics"\n Path under which to expose metrics. (env: TELEMETRY_PATH)\n --default.metrics="default-metrics.toml"\n File with default metrics in a TOML file. (env: DEFAULT_METRICS)\n --custom.metrics="" Comma separated list of file(s) that contain various custom metrics in a TOML format. (env: CUSTOM_METRICS)\n --query.timeout=5 Query timeout (in seconds). (env: QUERY_TIMEOUT)\n --database.maxIdleConns=0 Number of maximum idle connections in the connection pool. (env: DATABASE_MAXIDLECONNS)\n --database.maxOpenConns=10\n Number of maximum open connections in the connection pool. (env: DATABASE_MAXOPENCONNS)\n --database.poolIncrement=-1\n Connection increment when the connection pool reaches max capacity. (env: DATABASE_POOLINCREMENT)\n --database.poolMaxConnections=-1\n Maximum number of connections in the connection pool. (env: DATABASE_POOLMAXCONNECTIONS)\n --database.poolMinConnections=-1\n Minimum number of connections in the connection pool. (env: DATABASE_POOLMINCONNECTIONS)\n --scrape.interval=0s Interval between each scrape. Default is to scrape on collect requests.\n --log.disable=0 Set to 1 to disable alert logs\n --log.interval=15s Interval between log updates (e.g. 5s).\n --log.destination="/log/alert.log"\n File to output the alert log to. (env: LOG_DESTINATION)\n --web.listen-address=:9161 ...\n Addresses on which to expose metrics and web interface. Repeatable for multiple addresses. Examples: `:9100` or `[::1]:9100` for http, `vsock://:9100` for vsock\n --web.config.file="" Path to configuration file that can enable TLS or authentication. See: https://github.com/prometheus/exporter-toolkit/blob/master/docs/web-configuration.md\n --log.level=info Only log messages with the given severity or above. One of: [debug, info, warn, error]\n --log.format=logfmt Output format of log messages. One of: [logfmt, json]\n --[no-]version Show application version.\n'})}),"\n",(0,a.jsx)(n.p,{children:"You may provide the connection details using these variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_USERNAME"})," is the database username, e.g., ",(0,a.jsx)(n.code,{children:"pdbadmin"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_PASSWORD"})," is the password for that user, e.g., ",(0,a.jsx)(n.code,{children:"Welcome12345"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_CONNECT_STRING"})," is the connection string, e.g., ",(0,a.jsx)(n.code,{children:"localhost:1521/freepdb1"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_ROLE"})," (Optional) can be set to ",(0,a.jsx)(n.code,{children:"SYSDBA"})," or ",(0,a.jsx)(n.code,{children:"SYSOPER"})," if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"ORACLE_HOME"})," is the location of the Oracle Instant Client, e.g., ",(0,a.jsx)(n.code,{children:"/lib/oracle/21/client64/lib"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"TNS_ADMIN"})," is the location of your (unzipped) wallet. The ",(0,a.jsx)(n.code,{children:"DIRECTORY"})," set in the ",(0,a.jsx)(n.code,{children:"sqlnet.ora"})," file must match the path that it will be mounted on inside the container."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The following example puts the logfile in the current location with the filename ",(0,a.jsx)(n.code,{children:"alert.log"})," and loads the default matrics file (",(0,a.jsx)(n.code,{children:"default-metrics,toml"}),") from the current location."]}),"\n",(0,a.jsxs)(n.p,{children:["If you prefer to provide configuration via a ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/config-file",children:"config file"}),", you may do so with the ",(0,a.jsx)(n.code,{children:"--config.file"}),' argument. The use of a config file over command line arguments is preferred. If a config file is not provided, the "default" database connection is managed by command line arguments.']}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n# If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,\n# \"$test$pwd\" => \"$$test$$pwd\"\n# Otherwise, the value will be expanded as an environment variable.\n\n# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n ## Database connection information for the \"default\" database.\n default:\n ## Database username\n username: ${DB_USERNAME}\n ## Database password\n password: ${DB_PASSWORD}\n ## Database password file\n ## If specified, will load the database password from a file.\n # passwordFile: ${DB_PASSWORD_FILE}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ## Arbitrary labels to add to each metric scraped from this database\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\nmetrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files\n custom:\n - custom-metrics-example/custom-metrics.toml\n\nlog:\n # Path of log file\n destination: /opt/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n\n# Optionally configure prometheus webserver\n#web:\n# listenAddresses: [':9161']\n# systemdSocket: true|false\n# configFile: /path/to/webconfigfile\n"})}),"\n",(0,a.jsx)(n.h3,{id:"docker-compose",children:"Docker Compose"}),"\n",(0,a.jsx)(n.p,{children:'If you would like to set up a test environment with the exporter, you can use the provided "Docker Compose" file in this repository which will start an Oracle Database instance, the exporter, Prometheus and Grafana.'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd docker-compose\ndocker-compose up -d\n"})}),"\n",(0,a.jsx)(n.p,{children:"The containers will take a short time to start. The first time, the Oracle container might take a few minutes to start while it creates the database instance, but this is a one-time operation, and subequent restarts will be much faster (a few seconds)."}),"\n",(0,a.jsx)(n.p,{children:"Once the containers are all running, you can access the services using these URLs:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"http://localhost:9161/metrics",children:"Exporter"})}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"http://localhost:9090",children:"Prometheus"}),' - try a query for "oracle".']}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"http://localhost:3000",children:"Grafana"}),' - username is "admin" and password is "grafana". An Oracle Database dashboard is provisioned and configured to use data from the exporter.']}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>r});var o=t(6540);const a={},s=o.createContext(a);function i(e){const n=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/9dfe3062.20622ddb.js b/docs/assets/js/9dfe3062.20622ddb.js new file mode 100644 index 00000000..b0d7f02f --- /dev/null +++ b/docs/assets/js/9dfe3062.20622ddb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[8690],{1138:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>d,contentTitle:()=>i,default:()=>l,frontMatter:()=>o,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"getting-started/grafana-dashboards","title":"Grafana Dashboards","description":"Sample Grafana dashboards are included with the exporter.","source":"@site/versioned_docs/version-2.2.0/getting-started/grafana-dashboards.md","sourceDirName":"getting-started","slug":"/getting-started/grafana-dashboards","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/grafana-dashboards","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/getting-started/grafana-dashboards.md","tags":[],"version":"2.2.0","sidebarPosition":4,"frontMatter":{"title":"Grafana Dashboards","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Kubernetes","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/kubernetes"},"next":{"title":"Configuration","permalink":"/oracle-db-appdev-monitoring/docs/category/configuration"}}');var s=t(4848),n=t(8453);const o={title:"Grafana Dashboards",sidebar_position:4},i="Grafana Dashboards",d={},c=[];function h(e){const a={a:"a",h1:"h1",header:"header",img:"img",p:"p",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"grafana-dashboards",children:"Grafana Dashboards"})}),"\n",(0,s.jsx)(a.p,{children:"Sample Grafana dashboards are included with the exporter."}),"\n",(0,s.jsxs)(a.p,{children:["A sample Grafana dashboard definition is provided ",(0,s.jsx)(a.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/docker-compose/grafana/dashboards",children:"in this directory"}),". You can import these dashboards into your Grafana instance, and set it to use the Prometheus datasource that you have defined for the Prometheus instance that is collecting metrics from the exporter."]}),"\n",(0,s.jsx)(a.p,{children:"The dashboard shows some basic information, as shown below:"}),"\n",(0,s.jsx)(a.p,{children:(0,s.jsx)(a.img,{alt:"Oracle Database Dashboard",src:t(2162).A+"",width:"1904",height:"1203"})})]})}function l(e={}){const{wrapper:a}={...(0,n.R)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},2162:(e,a,t)=>{t.d(a,{A:()=>r});const r=t.p+"assets/images/oracledb-dashboard-cac23ad464ac40e39bf6348f688daa1d.png"},8453:(e,a,t)=>{t.d(a,{R:()=>o,x:()=>i});var r=t(6540);const s={},n=r.createContext(s);function o(e){const a=r.useContext(n);return r.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function i(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(n.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/9f37b08d.72627b89.js b/docs/assets/js/9f37b08d.72627b89.js new file mode 100644 index 00000000..f49b8a4d --- /dev/null +++ b/docs/assets/js/9f37b08d.72627b89.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3170],{8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>s});var r=n(6540);const a={},o=r.createContext(a);function i(e){const t=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),r.createElement(o.Provider,{value:t},e.children)}},9779:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"releases/roadmap","title":"Roadmap","description":"Planned and upcoming features for the exporter.","source":"@site/versioned_docs/version-2.2.0/releases/roadmap.md","sourceDirName":"releases","slug":"/releases/roadmap","permalink":"/oracle-db-appdev-monitoring/docs/releases/roadmap","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/releases/roadmap.md","tags":[],"version":"2.2.0","sidebarPosition":1,"frontMatter":{"title":"Roadmap","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Releases","permalink":"/oracle-db-appdev-monitoring/docs/category/releases"},"next":{"title":"Changelog","permalink":"/oracle-db-appdev-monitoring/docs/releases/changelog"}}');var a=n(4848),o=n(8453);const i={title:"Roadmap",sidebar_position:1},s="Exporter Roadmap",l={},d=[];function c(e){const t={h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"exporter-roadmap",children:"Exporter Roadmap"})}),"\n",(0,a.jsx)(t.p,{children:"Planned and upcoming features for the exporter."}),"\n",(0,a.jsx)(t.p,{children:"We welcome input on community-driven features you'd like to see supported. Please open an issue in this repository with your suggestions."}),"\n",(0,a.jsx)(t.p,{children:"Currently, we plan to address the following key features:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"Provide default Oracle Exadata metrics"}),"\n",(0,a.jsx)(t.li,{children:"Provide default GoldenGate metrics"}),"\n",(0,a.jsx)(t.li,{children:"Enhance database alert logging and alert log metrics"}),"\n",(0,a.jsx)(t.li,{children:"Provide the option to have the Oracle client outside of the container image, e.g., on a shared volume,"}),"\n",(0,a.jsx)(t.li,{children:"Implement the ability to update the configuration dynamically, i.e., without a restart"}),"\n",(0,a.jsx)(t.li,{children:"Implement support for tracing within the database, e.g., using an execution context ID provide by an external caller"}),"\n",(0,a.jsx)(t.li,{children:"Provide additional pre-built Grafana dashboards,"}),"\n",(0,a.jsx)(t.li,{children:"Integration with Spring Observability, e.g., Micrometer"}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/cfb8cbdc.29a4b7ad.js b/docs/assets/js/9fe04538.2ff8aad7.js similarity index 63% rename from docs/assets/js/cfb8cbdc.29a4b7ad.js rename to docs/assets/js/9fe04538.2ff8aad7.js index b18844f0..916124ae 100644 --- a/docs/assets/js/cfb8cbdc.29a4b7ad.js +++ b/docs/assets/js/9fe04538.2ff8aad7.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[9226],{3122:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"configuration/config-file","title":"Exporter Configuration","description":"The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.","source":"@site/versioned_docs/version-2.1.0/configuration/config-file.md","sourceDirName":"configuration","slug":"/configuration/config-file","permalink":"/oracle-db-appdev-monitoring/docs/configuration/config-file","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/config-file.md","tags":[],"version":"2.1.0","sidebarPosition":1,"frontMatter":{"title":"Exporter Configuration","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Configuration","permalink":"/oracle-db-appdev-monitoring/docs/category/configuration"},"next":{"title":"Custom Metrics","permalink":"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics"}}');var a=o(4848),i=o(8453);const r={title:"Exporter Configuration",sidebar_position:1},s="Exporter Configuration",c={},l=[{value:"Scrape on request vs. Scrape on interval",id:"scrape-on-request-vs-scrape-on-interval",level:3},{value:"Config file in a container image",id:"config-file-in-a-container-image",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"exporter-configuration",children:"Exporter Configuration"})}),"\n",(0,a.jsxs)(n.p,{children:["The recommended way to configure the exporter is with the ",(0,a.jsx)(n.code,{children:"--config.file"})," argument, specifying a YAML configuration file."]}),"\n",(0,a.jsx)(n.p,{children:"The configuration file contains the following options:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n# If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,\n# \"$test$pwd\" => \"$$test$$pwd\"\n# Otherwise, the value will be expanded as an environment variable.\n\n# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n ## Database connection information for the \"default\" database.\n default:\n ## Database username\n username: ${DB_USERNAME}\n ## Database password\n password: ${DB_PASSWORD}\n ## Database password file\n ## If specified, will load the database password from a file.\n # passwordFile: ${DB_PASSWORD_FILE}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ## Arbitrary labels to add to each metric scraped from this database\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\nmetrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files\n custom:\n - custom-metrics-example/custom-metrics.toml\n\nlog:\n # Path of log file\n destination: /opt/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n\n# Optionally configure prometheus webserver\n#web:\n# listenAddresses: [':9161']\n# systemdSocket: true|false\n# configFile: /path/to/webconfigfile\n"})}),"\n",(0,a.jsx)(n.h3,{id:"scrape-on-request-vs-scrape-on-interval",children:"Scrape on request vs. Scrape on interval"}),"\n",(0,a.jsxs)(n.p,{children:["The metrics exporter has two scraping modes: scrape on request, and scrape on interval. By default, the metrics exporter scrapes metrics on request, when the ",(0,a.jsx)(n.code,{children:"/metrics"})," endpoint is invoked."]}),"\n",(0,a.jsxs)(n.p,{children:["To scrape metrics on a given interval, set the ",(0,a.jsx)(n.code,{children:"metrics.scrapeInterval"})," property to a valid interval:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"metrics:\n # Metrics will be scraped every 30s.\n scrapeInterval: 30s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["An individual metric may have its own scrape interval separate from the exporter's scrape interval. See the ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics#metric-schema",children:"metric schema"})," for details on configuring per-metric scrape intervals."]}),"\n",(0,a.jsx)(n.h3,{id:"config-file-in-a-container-image",children:"Config file in a container image"}),"\n",(0,a.jsx)(n.p,{children:"To add your custom config file to a container image, you can layer the base exporter image and include that config:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-Dockerfile",children:'FROM container-registry.oracle.com/database/observability-exporter:2.1.0\nCOPY my-exporter-config.yaml /\nENTRYPOINT ["/oracledb_exporter", "--config.file", "/my-exporter-config.yaml"]\n'})})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>s});var t=o(6540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4945],{8239:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"configuration/config-file","title":"Exporter Configuration","description":"The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.","source":"@site/versioned_docs/version-2.2.0/configuration/config-file.md","sourceDirName":"configuration","slug":"/configuration/config-file","permalink":"/oracle-db-appdev-monitoring/docs/configuration/config-file","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/configuration/config-file.md","tags":[],"version":"2.2.0","sidebarPosition":1,"frontMatter":{"title":"Exporter Configuration","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Configuration","permalink":"/oracle-db-appdev-monitoring/docs/category/configuration"},"next":{"title":"Custom Metrics","permalink":"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics"}}');var a=o(4848),i=o(8453);const r={title:"Exporter Configuration",sidebar_position:1},s="Exporter Configuration",c={},l=[{value:"Scrape on request vs. Scrape on interval",id:"scrape-on-request-vs-scrape-on-interval",level:3},{value:"Config file in a container image",id:"config-file-in-a-container-image",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"exporter-configuration",children:"Exporter Configuration"})}),"\n",(0,a.jsxs)(n.p,{children:["The recommended way to configure the exporter is with the ",(0,a.jsx)(n.code,{children:"--config.file"})," argument, specifying a YAML configuration file."]}),"\n",(0,a.jsx)(n.p,{children:"The configuration file contains the following options:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n# If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,\n# \"$test$pwd\" => \"$$test$$pwd\"\n# Otherwise, the value will be expanded as an environment variable.\n\n# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n ## Database connection information for the \"default\" database.\n default:\n ## Database username\n username: ${DB_USERNAME}\n ## Database password\n password: ${DB_PASSWORD}\n ## Database password file\n ## If specified, will load the database password from a file.\n # passwordFile: ${DB_PASSWORD_FILE}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ## Arbitrary labels to add to each metric scraped from this database\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\nmetrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files\n custom:\n - custom-metrics-example/custom-metrics.toml\n\nlog:\n # Path of log file\n destination: /opt/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n\n# Optionally configure prometheus webserver\n#web:\n# listenAddresses: [':9161']\n# systemdSocket: true|false\n# configFile: /path/to/webconfigfile\n"})}),"\n",(0,a.jsxs)(n.p,{children:["From the exporter configuration file, you may optionally load database credentials from ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/oci-vault",children:"OCI Vault"}),", ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/azure-vault",children:"Azure Vault"}),", or ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/hashicorp-vault",children:"HashiCorp Vault"}),".."]}),"\n",(0,a.jsx)(n.h3,{id:"scrape-on-request-vs-scrape-on-interval",children:"Scrape on request vs. Scrape on interval"}),"\n",(0,a.jsxs)(n.p,{children:["The metrics exporter has two scraping modes: scrape on request, and scrape on interval. By default, the metrics exporter scrapes metrics on request, when the ",(0,a.jsx)(n.code,{children:"/metrics"})," endpoint is invoked."]}),"\n",(0,a.jsxs)(n.p,{children:["To scrape metrics on a given interval, set the ",(0,a.jsx)(n.code,{children:"metrics.scrapeInterval"})," property to a valid interval:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"metrics:\n # Metrics will be scraped every 30s.\n scrapeInterval: 30s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["An individual metric may have its own scrape interval separate from the exporter's scrape interval. See the ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics#metric-schema",children:"metric schema"})," for details on configuring per-metric scrape intervals."]}),"\n",(0,a.jsx)(n.h3,{id:"config-file-in-a-container-image",children:"Config file in a container image"}),"\n",(0,a.jsx)(n.p,{children:"To add your custom config file to a container image, you can layer the base exporter image and include that config:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-Dockerfile",children:'FROM container-registry.oracle.com/database/observability-exporter:2.2.0\nCOPY my-exporter-config.yaml /\nENTRYPOINT ["/oracledb_exporter", "--config.file", "/my-exporter-config.yaml"]\n'})})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>s});var t=o(6540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/a989571e.754a5e4f.js b/docs/assets/js/a989571e.41e46a0f.js similarity index 56% rename from docs/assets/js/a989571e.754a5e4f.js rename to docs/assets/js/a989571e.41e46a0f.js index 079f4de4..7b1575bd 100644 --- a/docs/assets/js/a989571e.754a5e4f.js +++ b/docs/assets/js/a989571e.41e46a0f.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6898],{5892:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Advanced","description":"Advanced configuration.","slug":"/category/advanced","permalink":"/oracle-db-appdev-monitoring/docs/category/advanced","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Azure Vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/azure-vault"},"next":{"title":"Configuring the Go Runtime","permalink":"/oracle-db-appdev-monitoring/docs/advanced/go-runtime"}}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6898],{5892:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Advanced","description":"Advanced configuration.","slug":"/category/advanced","permalink":"/oracle-db-appdev-monitoring/docs/category/advanced","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"HashiCorp Vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/hashicorp-vault"},"next":{"title":"Configuring the Go Runtime","permalink":"/oracle-db-appdev-monitoring/docs/advanced/go-runtime"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/af966633.71b7106b.js b/docs/assets/js/af966633.1839a3c4.js similarity index 99% rename from docs/assets/js/af966633.71b7106b.js rename to docs/assets/js/af966633.1839a3c4.js index 357733ec..ffcf6f76 100644 --- a/docs/assets/js/af966633.71b7106b.js +++ b/docs/assets/js/af966633.1839a3c4.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[2173],{1035:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"getting-started/basics","title":"Installation","description":"In this section you will find information on running the exporter.","source":"@site/docs/getting-started/basics.md","sourceDirName":"getting-started","slug":"/getting-started/basics","permalink":"/oracle-db-appdev-monitoring/docs/next/getting-started/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/getting-started/basics.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Installation","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/oracle-db-appdev-monitoring/docs/next/category/getting-started"},"next":{"title":"Default Metrics","permalink":"/oracle-db-appdev-monitoring/docs/next/getting-started/default-metrics"}}');var a=t(4848),s=t(8453);const i={title:"Installation",sidebar_position:1},r="Installation",l={},c=[{value:"Database Permissions",id:"database-permissions",level:2},{value:"Docker, Podman, etc",id:"docker-podman-etc",level:2},{value:"Oracle Database Free",id:"oracle-database-free",level:3},{value:"Exporter",id:"exporter",level:3},{value:"Simple connection",id:"simple-connection",level:3},{value:"Standalone Binary",id:"standalone-binary",level:2},{value:"Docker Compose",id:"docker-compose",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"installation",children:"Installation"})}),"\n",(0,a.jsx)(n.p,{children:"In this section you will find information on running the exporter."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["In a container runtime like ",(0,a.jsx)(n.a,{href:"#docker-podman-etc",children:"Docker, Podman, etc"})]}),"\n",(0,a.jsxs)(n.li,{children:["In a test/demo environment using ",(0,a.jsx)(n.a,{href:"#docker-compose",children:"Docker Compose"})]}),"\n",(0,a.jsxs)(n.li,{children:["In ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/getting-started/kubernetes",children:"Kubernetes"})]}),"\n",(0,a.jsxs)(n.li,{children:["As a ",(0,a.jsx)(n.a,{href:"#standalone-binary",children:"standalone binary"})]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"database-permissions",children:"Database Permissions"}),"\n",(0,a.jsxs)(n.p,{children:["For the built-in default metrics, the exporter database database user must have the ",(0,a.jsx)(n.code,{children:"SELECT_CATALOG_ROLE"})," privilege and/or ",(0,a.jsx)(n.code,{children:"SELECT"})," permission on the following objects:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"dba_tablespace_usage_metrics\ndba_tablespaces\ngv$system_wait_class\ngv$asm_diskgroup_stat\ngv$datafile\ngv$sysstat\ngv$process\ngv$waitclassmetric\ngv$session\ngv$resource_limit\ngv$parameter\ngv$database\ngv$sqlstats\ngv$sysmetric\nv$diag_alert_ext (for alert logs only)\n"})}),"\n",(0,a.jsx)(n.h2,{id:"docker-podman-etc",children:"Docker, Podman, etc"}),"\n",(0,a.jsxs)(n.p,{children:["You can run the exporter in a local container using a container image from ",(0,a.jsx)(n.a,{href:"https://container-registry.oracle.com",children:"Oracle Container Registry"}),'. The container image is available in the "observability-exporter" repository in the "Database" category. No authentication or license presentment/acceptance are required to pull this image from the registry.']}),"\n",(0,a.jsx)(n.h3,{id:"oracle-database-free",children:"Oracle Database Free"}),"\n",(0,a.jsxs)(n.p,{children:["If you need an Oracle Database to test the exporter, you can use this command to start up an instance of ",(0,a.jsx)(n.a,{href:"https://www.oracle.com/database/free/",children:"Oracle Database Free"})," which also requires no authentication or license presentment/acceptance to pull the image."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker run --name free23ai \\\n -d \\\n -p 1521:1521 \\\n -e ORACLE_PASSWORD=Welcome12345 \\\n gvenzl/oracle-free:23.9-slim-faststart\n"})}),"\n",(0,a.jsx)(n.p,{children:'This will pull the image and start up the database with a listener on port 1521. It will also create a pluggable database (a database container) called "FREEPDB1" and will set the admin passwords to the password you specified on this command.'}),"\n",(0,a.jsx)(n.p,{children:"You can tail the logs to see when the database is ready to use:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker logs -f free23ai\n\n(look for this message...)\n#########################\nDATABASE IS READY TO USE!\n#########################\n"})}),"\n",(0,a.jsx)(n.p,{children:'To obtain the IP address of the container, which you will need to connect to the database, use this command. Note: depending on your platform and container runtime, you may be able to access the database at "localhost":'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'docker inspect free23ai | grep IPA\n "SecondaryIPAddresses": null,\n "IPAddress": "172.17.0.2",\n "IPAMConfig": null,\n "IPAddress": "172.17.0.2",\n'})}),"\n",(0,a.jsx)(n.h3,{id:"exporter",children:"Exporter"}),"\n",(0,a.jsx)(n.p,{children:"You need to give the exporter the connection details for the Oracle Database that you want it to run against. You can use a simple connection, or a wallet."}),"\n",(0,a.jsx)(n.h3,{id:"simple-connection",children:"Simple connection"}),"\n",(0,a.jsx)(n.p,{children:"For a simple connection, you will provide the details using these variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_USERNAME"})," is the database username, e.g., ",(0,a.jsx)(n.code,{children:"pdbadmin"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_PASSWORD"})," is the password for that user, e.g., ",(0,a.jsx)(n.code,{children:"Welcome12345"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_CONNECT_STRING"})," is the connection string, e.g., ",(0,a.jsx)(n.code,{children:"free23ai:1521/freepdb"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_ROLE"})," (Optional) can be set to ",(0,a.jsx)(n.code,{children:"SYSDBA"}),", ",(0,a.jsx)(n.code,{children:"SYSOPER"}),", ",(0,a.jsx)(n.code,{children:"SYSBACKUP"}),", ",(0,a.jsx)(n.code,{children:"SYSDG"}),", ",(0,a.jsx)(n.code,{children:"SYSKM"}),", ",(0,a.jsx)(n.code,{children:"SYSRAC"})," or ",(0,a.jsx)(n.code,{children:"SYSASM"})," if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"To run the exporter in a container and expose the port, use a command like this, with the appropriate values for the environment variables:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker run -it --rm \\\n -e DB_USERNAME=pdbadmin \\\n -e DB_PASSWORD=Welcome12345 \\\n -e DB_CONNECT_STRING=free23ai:1521/freepdb \\\n -p 9161:9161 \\\n container-registry.oracle.com/database/observability-exporter:2.1.0\n"})}),"\n",(0,a.jsx)(n.h2,{id:"standalone-binary",children:"Standalone Binary"}),"\n",(0,a.jsxs)(n.p,{children:["Pre-compiled versions for Linux, ARM and Darwin 64-bit can be found under ",(0,a.jsx)(n.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/releases",children:"releases"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In order to run, you'll need the ",(0,a.jsx)(n.a,{href:"http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html",children:"Oracle Instant Client Basic"})," for your operating system. Only the basic version is required for the exporter."]}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["NOTE: If you are running the Standalone binary on a Mac ARM platform you must set the variable ",(0,a.jsx)(n.code,{children:"DYLD_LIBRARY_PATH"})," to the location of where the instant client installed. For example ",(0,a.jsx)(n.code,{children:"export DYLD_LIBRARY_PATH=/lib/oracle/instantclient_23_3"}),"."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The following command line arguments (flags) can be passed to the exporter (the --help flag will show the table below)."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'Usage of oracledb_exporter:\n --config.file="example-config.yaml"\n File with metrics exporter configuration. (env: CONFIG_FILE)\n --web.telemetry-path="/metrics"\n Path under which to expose metrics. (env: TELEMETRY_PATH)\n --default.metrics="default-metrics.toml"\n File with default metrics in a TOML file. (env: DEFAULT_METRICS)\n --custom.metrics="" Comma separated list of file(s) that contain various custom metrics in a TOML format. (env: CUSTOM_METRICS)\n --query.timeout=5 Query timeout (in seconds). (env: QUERY_TIMEOUT)\n --database.maxIdleConns=0 Number of maximum idle connections in the connection pool. (env: DATABASE_MAXIDLECONNS)\n --database.maxOpenConns=10\n Number of maximum open connections in the connection pool. (env: DATABASE_MAXOPENCONNS)\n --database.poolIncrement=-1\n Connection increment when the connection pool reaches max capacity. (env: DATABASE_POOLINCREMENT)\n --database.poolMaxConnections=-1\n Maximum number of connections in the connection pool. (env: DATABASE_POOLMAXCONNECTIONS)\n --database.poolMinConnections=-1\n Minimum number of connections in the connection pool. (env: DATABASE_POOLMINCONNECTIONS)\n --scrape.interval=0s Interval between each scrape. Default is to scrape on collect requests.\n --log.disable=0 Set to 1 to disable alert logs\n --log.interval=15s Interval between log updates (e.g. 5s).\n --log.destination="/log/alert.log"\n File to output the alert log to. (env: LOG_DESTINATION)\n --web.listen-address=:9161 ...\n Addresses on which to expose metrics and web interface. Repeatable for multiple addresses. Examples: `:9100` or `[::1]:9100` for http, `vsock://:9100` for vsock\n --web.config.file="" Path to configuration file that can enable TLS or authentication. See: https://github.com/prometheus/exporter-toolkit/blob/master/docs/web-configuration.md\n --log.level=info Only log messages with the given severity or above. One of: [debug, info, warn, error]\n --log.format=logfmt Output format of log messages. One of: [logfmt, json]\n --[no-]version Show application version.\n'})}),"\n",(0,a.jsx)(n.p,{children:"You may provide the connection details using these variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_USERNAME"})," is the database username, e.g., ",(0,a.jsx)(n.code,{children:"pdbadmin"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_PASSWORD"})," is the password for that user, e.g., ",(0,a.jsx)(n.code,{children:"Welcome12345"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_CONNECT_STRING"})," is the connection string, e.g., ",(0,a.jsx)(n.code,{children:"localhost:1521/freepdb1"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_ROLE"})," (Optional) can be set to ",(0,a.jsx)(n.code,{children:"SYSDBA"})," or ",(0,a.jsx)(n.code,{children:"SYSOPER"})," if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"ORACLE_HOME"})," is the location of the Oracle Instant Client, e.g., ",(0,a.jsx)(n.code,{children:"/lib/oracle/21/client64/lib"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"TNS_ADMIN"})," is the location of your (unzipped) wallet. The ",(0,a.jsx)(n.code,{children:"DIRECTORY"})," set in the ",(0,a.jsx)(n.code,{children:"sqlnet.ora"})," file must match the path that it will be mounted on inside the container."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The following example puts the logfile in the current location with the filename ",(0,a.jsx)(n.code,{children:"alert.log"})," and loads the default matrics file (",(0,a.jsx)(n.code,{children:"default-metrics,toml"}),") from the current location."]}),"\n",(0,a.jsxs)(n.p,{children:["If you prefer to provide configuration via a ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/config-file",children:"config file"}),", you may do so with the ",(0,a.jsx)(n.code,{children:"--config.file"}),' argument. The use of a config file over command line arguments is preferred. If a config file is not provided, the "default" database connection is managed by command line arguments.']}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n# If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,\n# \"$test$pwd\" => \"$$test$$pwd\"\n# Otherwise, the value will be expanded as an environment variable.\n\n# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n ## Database connection information for the \"default\" database.\n default:\n ## Database username\n username: ${DB_USERNAME}\n ## Database password\n password: ${DB_PASSWORD}\n ## Database password file\n ## If specified, will load the database password from a file.\n # passwordFile: ${DB_PASSWORD_FILE}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ## Arbitrary labels to add to each metric scraped from this database\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\nmetrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files\n custom:\n - custom-metrics-example/custom-metrics.toml\n\nlog:\n # Path of log file\n destination: /opt/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n\n# Optionally configure prometheus webserver\n#web:\n# listenAddresses: [':9161']\n# systemdSocket: true|false\n# configFile: /path/to/webconfigfile\n"})}),"\n",(0,a.jsx)(n.h3,{id:"docker-compose",children:"Docker Compose"}),"\n",(0,a.jsx)(n.p,{children:'If you would like to set up a test environment with the exporter, you can use the provided "Docker Compose" file in this repository which will start an Oracle Database instance, the exporter, Prometheus and Grafana.'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd docker-compose\ndocker-compose up -d\n"})}),"\n",(0,a.jsx)(n.p,{children:"The containers will take a short time to start. The first time, the Oracle container might take a few minutes to start while it creates the database instance, but this is a one-time operation, and subequent restarts will be much faster (a few seconds)."}),"\n",(0,a.jsx)(n.p,{children:"Once the containers are all running, you can access the services using these URLs:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"http://localhost:9161/metrics",children:"Exporter"})}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"http://localhost:9090",children:"Prometheus"}),' - try a query for "oracle".']}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"http://localhost:3000",children:"Grafana"}),' - username is "admin" and password is "grafana". An Oracle Database dashboard is provisioned and configured to use data from the exporter.']}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>r});var o=t(6540);const a={},s=o.createContext(a);function i(e){const n=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[2173],{1035:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"getting-started/basics","title":"Installation","description":"In this section you will find information on running the exporter.","source":"@site/docs/getting-started/basics.md","sourceDirName":"getting-started","slug":"/getting-started/basics","permalink":"/oracle-db-appdev-monitoring/docs/next/getting-started/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/getting-started/basics.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Installation","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/oracle-db-appdev-monitoring/docs/next/category/getting-started"},"next":{"title":"Default Metrics","permalink":"/oracle-db-appdev-monitoring/docs/next/getting-started/default-metrics"}}');var a=t(4848),s=t(8453);const i={title:"Installation",sidebar_position:1},r="Installation",l={},c=[{value:"Database Permissions",id:"database-permissions",level:2},{value:"Docker, Podman, etc",id:"docker-podman-etc",level:2},{value:"Oracle Database Free",id:"oracle-database-free",level:3},{value:"Exporter",id:"exporter",level:3},{value:"Simple connection",id:"simple-connection",level:3},{value:"Standalone Binary",id:"standalone-binary",level:2},{value:"Docker Compose",id:"docker-compose",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"installation",children:"Installation"})}),"\n",(0,a.jsx)(n.p,{children:"In this section you will find information on running the exporter."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["In a container runtime like ",(0,a.jsx)(n.a,{href:"#docker-podman-etc",children:"Docker, Podman, etc"})]}),"\n",(0,a.jsxs)(n.li,{children:["In a test/demo environment using ",(0,a.jsx)(n.a,{href:"#docker-compose",children:"Docker Compose"})]}),"\n",(0,a.jsxs)(n.li,{children:["In ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/getting-started/kubernetes",children:"Kubernetes"})]}),"\n",(0,a.jsxs)(n.li,{children:["As a ",(0,a.jsx)(n.a,{href:"#standalone-binary",children:"standalone binary"})]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"database-permissions",children:"Database Permissions"}),"\n",(0,a.jsxs)(n.p,{children:["For the built-in default metrics, the exporter database database user must have the ",(0,a.jsx)(n.code,{children:"SELECT_CATALOG_ROLE"})," privilege and/or ",(0,a.jsx)(n.code,{children:"SELECT"})," permission on the following objects:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"dba_tablespace_usage_metrics\ndba_tablespaces\ngv$system_wait_class\ngv$asm_diskgroup_stat\ngv$datafile\ngv$sysstat\ngv$process\ngv$waitclassmetric\ngv$session\ngv$resource_limit\ngv$parameter\ngv$database\ngv$sqlstats\ngv$sysmetric\nv$diag_alert_ext (for alert logs only)\n"})}),"\n",(0,a.jsx)(n.h2,{id:"docker-podman-etc",children:"Docker, Podman, etc"}),"\n",(0,a.jsxs)(n.p,{children:["You can run the exporter in a local container using a container image from ",(0,a.jsx)(n.a,{href:"https://container-registry.oracle.com",children:"Oracle Container Registry"}),'. The container image is available in the "observability-exporter" repository in the "Database" category. No authentication or license presentment/acceptance are required to pull this image from the registry.']}),"\n",(0,a.jsx)(n.h3,{id:"oracle-database-free",children:"Oracle Database Free"}),"\n",(0,a.jsxs)(n.p,{children:["If you need an Oracle Database to test the exporter, you can use this command to start up an instance of ",(0,a.jsx)(n.a,{href:"https://www.oracle.com/database/free/",children:"Oracle Database Free"})," which also requires no authentication or license presentment/acceptance to pull the image."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker run --name free23ai \\\n -d \\\n -p 1521:1521 \\\n -e ORACLE_PASSWORD=Welcome12345 \\\n gvenzl/oracle-free:23.9-slim-faststart\n"})}),"\n",(0,a.jsx)(n.p,{children:'This will pull the image and start up the database with a listener on port 1521. It will also create a pluggable database (a database container) called "FREEPDB1" and will set the admin passwords to the password you specified on this command.'}),"\n",(0,a.jsx)(n.p,{children:"You can tail the logs to see when the database is ready to use:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker logs -f free23ai\n\n(look for this message...)\n#########################\nDATABASE IS READY TO USE!\n#########################\n"})}),"\n",(0,a.jsx)(n.p,{children:'To obtain the IP address of the container, which you will need to connect to the database, use this command. Note: depending on your platform and container runtime, you may be able to access the database at "localhost":'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'docker inspect free23ai | grep IPA\n "SecondaryIPAddresses": null,\n "IPAddress": "172.17.0.2",\n "IPAMConfig": null,\n "IPAddress": "172.17.0.2",\n'})}),"\n",(0,a.jsx)(n.h3,{id:"exporter",children:"Exporter"}),"\n",(0,a.jsx)(n.p,{children:"You need to give the exporter the connection details for the Oracle Database that you want it to run against. You can use a simple connection, or a wallet."}),"\n",(0,a.jsx)(n.h3,{id:"simple-connection",children:"Simple connection"}),"\n",(0,a.jsx)(n.p,{children:"For a simple connection, you will provide the details using these variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_USERNAME"})," is the database username, e.g., ",(0,a.jsx)(n.code,{children:"pdbadmin"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_PASSWORD"})," is the password for that user, e.g., ",(0,a.jsx)(n.code,{children:"Welcome12345"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_CONNECT_STRING"})," is the connection string, e.g., ",(0,a.jsx)(n.code,{children:"free23ai:1521/freepdb"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_ROLE"})," (Optional) can be set to ",(0,a.jsx)(n.code,{children:"SYSDBA"}),", ",(0,a.jsx)(n.code,{children:"SYSOPER"}),", ",(0,a.jsx)(n.code,{children:"SYSBACKUP"}),", ",(0,a.jsx)(n.code,{children:"SYSDG"}),", ",(0,a.jsx)(n.code,{children:"SYSKM"}),", ",(0,a.jsx)(n.code,{children:"SYSRAC"})," or ",(0,a.jsx)(n.code,{children:"SYSASM"})," if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"To run the exporter in a container and expose the port, use a command like this, with the appropriate values for the environment variables:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker run -it --rm \\\n -e DB_USERNAME=pdbadmin \\\n -e DB_PASSWORD=Welcome12345 \\\n -e DB_CONNECT_STRING=free23ai:1521/freepdb \\\n -p 9161:9161 \\\n container-registry.oracle.com/database/observability-exporter:2.2.0\n"})}),"\n",(0,a.jsx)(n.h2,{id:"standalone-binary",children:"Standalone Binary"}),"\n",(0,a.jsxs)(n.p,{children:["Pre-compiled versions for Linux, ARM and Darwin 64-bit can be found under ",(0,a.jsx)(n.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/releases",children:"releases"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In order to run, you'll need the ",(0,a.jsx)(n.a,{href:"http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html",children:"Oracle Instant Client Basic"})," for your operating system. Only the basic version is required for the exporter."]}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["NOTE: If you are running the Standalone binary on a Mac ARM platform you must set the variable ",(0,a.jsx)(n.code,{children:"DYLD_LIBRARY_PATH"})," to the location of where the instant client installed. For example ",(0,a.jsx)(n.code,{children:"export DYLD_LIBRARY_PATH=/lib/oracle/instantclient_23_3"}),"."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The following command line arguments (flags) can be passed to the exporter (the --help flag will show the table below)."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'Usage of oracledb_exporter:\n --config.file="example-config.yaml"\n File with metrics exporter configuration. (env: CONFIG_FILE)\n --web.telemetry-path="/metrics"\n Path under which to expose metrics. (env: TELEMETRY_PATH)\n --default.metrics="default-metrics.toml"\n File with default metrics in a TOML file. (env: DEFAULT_METRICS)\n --custom.metrics="" Comma separated list of file(s) that contain various custom metrics in a TOML format. (env: CUSTOM_METRICS)\n --query.timeout=5 Query timeout (in seconds). (env: QUERY_TIMEOUT)\n --database.maxIdleConns=0 Number of maximum idle connections in the connection pool. (env: DATABASE_MAXIDLECONNS)\n --database.maxOpenConns=10\n Number of maximum open connections in the connection pool. (env: DATABASE_MAXOPENCONNS)\n --database.poolIncrement=-1\n Connection increment when the connection pool reaches max capacity. (env: DATABASE_POOLINCREMENT)\n --database.poolMaxConnections=-1\n Maximum number of connections in the connection pool. (env: DATABASE_POOLMAXCONNECTIONS)\n --database.poolMinConnections=-1\n Minimum number of connections in the connection pool. (env: DATABASE_POOLMINCONNECTIONS)\n --scrape.interval=0s Interval between each scrape. Default is to scrape on collect requests.\n --log.disable=0 Set to 1 to disable alert logs\n --log.interval=15s Interval between log updates (e.g. 5s).\n --log.destination="/log/alert.log"\n File to output the alert log to. (env: LOG_DESTINATION)\n --web.listen-address=:9161 ...\n Addresses on which to expose metrics and web interface. Repeatable for multiple addresses. Examples: `:9100` or `[::1]:9100` for http, `vsock://:9100` for vsock\n --web.config.file="" Path to configuration file that can enable TLS or authentication. See: https://github.com/prometheus/exporter-toolkit/blob/master/docs/web-configuration.md\n --log.level=info Only log messages with the given severity or above. One of: [debug, info, warn, error]\n --log.format=logfmt Output format of log messages. One of: [logfmt, json]\n --[no-]version Show application version.\n'})}),"\n",(0,a.jsx)(n.p,{children:"You may provide the connection details using these variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_USERNAME"})," is the database username, e.g., ",(0,a.jsx)(n.code,{children:"pdbadmin"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_PASSWORD"})," is the password for that user, e.g., ",(0,a.jsx)(n.code,{children:"Welcome12345"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_CONNECT_STRING"})," is the connection string, e.g., ",(0,a.jsx)(n.code,{children:"localhost:1521/freepdb1"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_ROLE"})," (Optional) can be set to ",(0,a.jsx)(n.code,{children:"SYSDBA"})," or ",(0,a.jsx)(n.code,{children:"SYSOPER"})," if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"ORACLE_HOME"})," is the location of the Oracle Instant Client, e.g., ",(0,a.jsx)(n.code,{children:"/lib/oracle/21/client64/lib"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"TNS_ADMIN"})," is the location of your (unzipped) wallet. The ",(0,a.jsx)(n.code,{children:"DIRECTORY"})," set in the ",(0,a.jsx)(n.code,{children:"sqlnet.ora"})," file must match the path that it will be mounted on inside the container."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The following example puts the logfile in the current location with the filename ",(0,a.jsx)(n.code,{children:"alert.log"})," and loads the default matrics file (",(0,a.jsx)(n.code,{children:"default-metrics,toml"}),") from the current location."]}),"\n",(0,a.jsxs)(n.p,{children:["If you prefer to provide configuration via a ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/config-file",children:"config file"}),", you may do so with the ",(0,a.jsx)(n.code,{children:"--config.file"}),' argument. The use of a config file over command line arguments is preferred. If a config file is not provided, the "default" database connection is managed by command line arguments.']}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n# If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,\n# \"$test$pwd\" => \"$$test$$pwd\"\n# Otherwise, the value will be expanded as an environment variable.\n\n# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n ## Database connection information for the \"default\" database.\n default:\n ## Database username\n username: ${DB_USERNAME}\n ## Database password\n password: ${DB_PASSWORD}\n ## Database password file\n ## If specified, will load the database password from a file.\n # passwordFile: ${DB_PASSWORD_FILE}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ## Arbitrary labels to add to each metric scraped from this database\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\nmetrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files\n custom:\n - custom-metrics-example/custom-metrics.toml\n\nlog:\n # Path of log file\n destination: /opt/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n\n# Optionally configure prometheus webserver\n#web:\n# listenAddresses: [':9161']\n# systemdSocket: true|false\n# configFile: /path/to/webconfigfile\n"})}),"\n",(0,a.jsx)(n.h3,{id:"docker-compose",children:"Docker Compose"}),"\n",(0,a.jsx)(n.p,{children:'If you would like to set up a test environment with the exporter, you can use the provided "Docker Compose" file in this repository which will start an Oracle Database instance, the exporter, Prometheus and Grafana.'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd docker-compose\ndocker-compose up -d\n"})}),"\n",(0,a.jsx)(n.p,{children:"The containers will take a short time to start. The first time, the Oracle container might take a few minutes to start while it creates the database instance, but this is a one-time operation, and subequent restarts will be much faster (a few seconds)."}),"\n",(0,a.jsx)(n.p,{children:"Once the containers are all running, you can access the services using these URLs:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"http://localhost:9161/metrics",children:"Exporter"})}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"http://localhost:9090",children:"Prometheus"}),' - try a query for "oracle".']}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"http://localhost:3000",children:"Grafana"}),' - username is "admin" and password is "grafana". An Oracle Database dashboard is provisioned and configured to use data from the exporter.']}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>r});var o=t(6540);const a={},s=o.createContext(a);function i(e){const n=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/b405f669.6da9d314.js b/docs/assets/js/b405f669.6da9d314.js new file mode 100644 index 00000000..e47b583d --- /dev/null +++ b/docs/assets/js/b405f669.6da9d314.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3139],{7744:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Configuration","description":"How to configure the Oracle Database Metrics Exporter.","slug":"/category/configuration","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/configuration","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Grafana Dashboards","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/grafana-dashboards"},"next":{"title":"Exporter Configuration","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/config-file"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/b5bc6181.7ac33da9.js b/docs/assets/js/b5bc6181.7ac33da9.js new file mode 100644 index 00000000..915d57f6 --- /dev/null +++ b/docs/assets/js/b5bc6181.7ac33da9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6283],{1519:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"configuration/azure-vault","title":"Azure Vault","description":"Securely load database credentials from Azure Vault.","source":"@site/versioned_docs/version-2.1.0/configuration/azure-vault.md","sourceDirName":"configuration","slug":"/configuration/azure-vault","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/azure-vault","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/azure-vault.md","tags":[],"version":"2.1.0","sidebarPosition":7,"frontMatter":{"title":"Azure Vault","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"OCI Vault","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oci-vault"},"next":{"title":"Advanced","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/advanced"}}');var r=n(4848),i=n(8453);const o={title:"Azure Vault",sidebar_position:7},s="Azure Vault",u={},c=[{value:"Authentication",id:"authentication",level:3},{value:"Azure Vault CLI Configuration (without exporter config file)",id:"azure-vault-cli-configuration-without-exporter-config-file",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"azure-vault",children:"Azure Vault"})}),"\n",(0,r.jsx)(t.p,{children:"Securely load database credentials from Azure Vault."}),"\n",(0,r.jsxs)(t.p,{children:["Each database in the config file may be configured to use Azure Vault. To load the database username and/or password from Azure Vault, set the ",(0,r.jsx)(t.code,{children:"vault.azure"})," property to contain the Azure Vault ID, and secret names for the database username/password:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n azure:\n id: \n usernameSecret: \n passwordSecret: \n"})}),"\n",(0,r.jsx)(t.h3,{id:"authentication",children:"Authentication"}),"\n",(0,r.jsxs)(t.p,{children:["If you are running the exporter outside Azure, we recommend using ",(0,r.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/developer/go/sdk/authentication/authentication-on-premises-apps",children:"application service principal"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["If you are running the exporter inside Azure, we recommend using a ",(0,r.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/developer/go/sdk/authentication/authentication-azure-hosted-apps",children:"managed identity"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"You should set the following additional environment variables to allow the exporter to authenticate to Azure:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_TENANT_ID"})," should be set to your tenant ID"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_CLIENT_ID"})," should be set to the client ID to authenticate to Azure"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_CLIENT_SECRET"})," should be set to the client secret to authenticate to Azure"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"azure-vault-cli-configuration-without-exporter-config-file",children:"Azure Vault CLI Configuration (without exporter config file)"}),"\n",(0,r.jsx)(t.p,{children:"If using the default database with CLI parameters, the exporter will read the database username and password from secrets stored in Azure Key Vault if you set these environment variables:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_ID"})," should be set to the ID of the Azure Key Vault that you wish to use"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_USERNAME_SECRET"})," should be set to the name of the secret in the Azure Key Vault which contains the database username"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_PASSWORD_SECRET"})," should be set to the name of the secret in the Azure Key Vault which contains the database password"]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var a=n(6540);const r={},i=a.createContext(r);function o(e){const t=a.useContext(i);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/b5bc6181.96b82386.js b/docs/assets/js/b5bc6181.96b82386.js deleted file mode 100644 index 5760a618..00000000 --- a/docs/assets/js/b5bc6181.96b82386.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6283],{1519:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"configuration/azure-vault","title":"Azure Vault","description":"Securely load database credentials from Azure Vault.","source":"@site/versioned_docs/version-2.1.0/configuration/azure-vault.md","sourceDirName":"configuration","slug":"/configuration/azure-vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/azure-vault","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/azure-vault.md","tags":[],"version":"2.1.0","sidebarPosition":7,"frontMatter":{"title":"Azure Vault","sidebar_position":7},"sidebar":"tutorialSidebar","previous":{"title":"OCI Vault","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oci-vault"},"next":{"title":"Advanced","permalink":"/oracle-db-appdev-monitoring/docs/category/advanced"}}');var r=n(4848),i=n(8453);const o={title:"Azure Vault",sidebar_position:7},s="Azure Vault",u={},c=[{value:"Authentication",id:"authentication",level:3},{value:"Azure Vault CLI Configuration (without exporter config file)",id:"azure-vault-cli-configuration-without-exporter-config-file",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"azure-vault",children:"Azure Vault"})}),"\n",(0,r.jsx)(t.p,{children:"Securely load database credentials from Azure Vault."}),"\n",(0,r.jsxs)(t.p,{children:["Each database in the config file may be configured to use Azure Vault. To load the database username and/or password from Azure Vault, set the ",(0,r.jsx)(t.code,{children:"vault.azure"})," property to contain the Azure Vault ID, and secret names for the database username/password:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"databases:\n mydb:\n vault:\n azure:\n id: \n usernameSecret: \n passwordSecret: \n"})}),"\n",(0,r.jsx)(t.h3,{id:"authentication",children:"Authentication"}),"\n",(0,r.jsxs)(t.p,{children:["If you are running the exporter outside Azure, we recommend using ",(0,r.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/developer/go/sdk/authentication/authentication-on-premises-apps",children:"application service principal"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["If you are running the exporter inside Azure, we recommend using a ",(0,r.jsx)(t.a,{href:"https://learn.microsoft.com/en-us/azure/developer/go/sdk/authentication/authentication-azure-hosted-apps",children:"managed identity"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"You should set the following additional environment variables to allow the exporter to authenticate to Azure:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_TENANT_ID"})," should be set to your tenant ID"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_CLIENT_ID"})," should be set to the client ID to authenticate to Azure"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZURE_CLIENT_SECRET"})," should be set to the client secret to authenticate to Azure"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"azure-vault-cli-configuration-without-exporter-config-file",children:"Azure Vault CLI Configuration (without exporter config file)"}),"\n",(0,r.jsx)(t.p,{children:"If using the default database with CLI parameters, the exporter will read the database username and password from secrets stored in Azure Key Vault if you set these environment variables:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_ID"})," should be set to the ID of the Azure Key Vault that you wish to use"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_USERNAME_SECRET"})," should be set to the name of the secret in the Azure Key Vault which contains the database username"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"AZ_VAULT_PASSWORD_SECRET"})," should be set to the name of the secret in the Azure Key Vault which contains the database password"]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var a=n(6540);const r={},i=a.createContext(r);function o(e){const t=a.useContext(i);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/bfe4ccde.faf98df9.js b/docs/assets/js/bfe4ccde.faf98df9.js new file mode 100644 index 00000000..b1b87336 --- /dev/null +++ b/docs/assets/js/bfe4ccde.faf98df9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4003],{256:(e,o,r)=>{r.r(o),r.d(o,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"advanced/go-ora","title":"go-ora Driver","description":"The Oracle Database Metrics Exporter experimentally supports compiling with the go-ora database driver. By default, the exporter compiles using the godror database driver, which uses CGO execution to invoke Oracle Instant Client. the go-ora driver presents an option for users who want to use a \\"thin\\" database client without the Oracle Instant Client and CGO.","source":"@site/versioned_docs/version-2.2.0/advanced/go-ora.md","sourceDirName":"advanced","slug":"/advanced/go-ora","permalink":"/oracle-db-appdev-monitoring/docs/advanced/go-ora","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/advanced/go-ora.md","tags":[],"version":"2.2.0","sidebarPosition":5,"frontMatter":{"title":"go-ora Driver","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Compatibility with Older Database Versions","permalink":"/oracle-db-appdev-monitoring/docs/advanced/older-versions"},"next":{"title":"Releases","permalink":"/oracle-db-appdev-monitoring/docs/category/releases"}}');var a=r(4848),n=r(8453);const i={title:"go-ora Driver",sidebar_position:5},s="Using the go-ora database driver",d={},c=[{value:"Configuring go-ora",id:"configuring-go-ora",level:3},{value:"Build with go-ora",id:"build-with-go-ora",level:3}];function l(e){const o={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,n.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.header,{children:(0,a.jsx)(o.h1,{id:"using-the-go-ora-database-driver",children:"Using the go-ora database driver"})}),"\n",(0,a.jsxs)(o.p,{children:["The Oracle Database Metrics Exporter experimentally supports compiling with the ",(0,a.jsx)(o.a,{href:"https://github.com/sijms/go-ora",children:"go-ora database driver"}),". By default, the exporter compiles using the ",(0,a.jsx)(o.code,{children:"godror"}),' database driver, which uses CGO execution to invoke Oracle Instant Client. the go-ora driver presents an option for users who want to use a "thin" database client without the Oracle Instant Client and CGO.']}),"\n",(0,a.jsx)(o.h3,{id:"configuring-go-ora",children:"Configuring go-ora"}),"\n",(0,a.jsxs)(o.p,{children:["Because go-ora does not use Oracle Instant Client, it is recommended to provide all connection string options in the ",(0,a.jsx)(o.code,{children:"database.url"})," property:"]}),"\n",(0,a.jsx)(o.pre,{children:(0,a.jsx)(o.code,{className:"language-yaml",children:"databases:\n go_ora_db:\n username: myuser\n password: ******\n url: my_tnsname?wallet=/path/to/wallet&ssl=1\n"})}),"\n",(0,a.jsx)(o.h3,{id:"build-with-go-ora",children:"Build with go-ora"}),"\n",(0,a.jsxs)(o.p,{children:["To build using ",(0,a.jsx)(o.code,{children:"go-ora"})," instead of ",(0,a.jsx)(o.code,{children:"godror"}),", set ",(0,a.jsx)(o.code,{children:"TAGS=goora CGO_ENABLED=0"}),":"]}),"\n",(0,a.jsx)(o.pre,{children:(0,a.jsx)(o.code,{className:"language-bash",children:"make go-build TAGS=goora CGO_ENABLED=0\n"})})]})}function h(e={}){const{wrapper:o}={...(0,n.R)(),...e.components};return o?(0,a.jsx)(o,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},8453:(e,o,r)=>{r.d(o,{R:()=>i,x:()=>s});var t=r(6540);const a={},n=t.createContext(a);function i(e){const o=t.useContext(n);return t.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function s(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),t.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/c4e87715.b14dd93f.js b/docs/assets/js/c4e87715.a205459c.js similarity index 54% rename from docs/assets/js/c4e87715.b14dd93f.js rename to docs/assets/js/c4e87715.a205459c.js index e4d09c96..6bb570bc 100644 --- a/docs/assets/js/c4e87715.b14dd93f.js +++ b/docs/assets/js/c4e87715.a205459c.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4353],{9199:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Advanced","description":"Advanced configuration.","slug":"/category/advanced","permalink":"/oracle-db-appdev-monitoring/docs/next/category/advanced","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Azure Vault","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/azure-vault"},"next":{"title":"Configuring the Go Runtime","permalink":"/oracle-db-appdev-monitoring/docs/next/advanced/go-runtime"}}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4353],{9199:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Advanced","description":"Advanced configuration.","slug":"/category/advanced","permalink":"/oracle-db-appdev-monitoring/docs/next/category/advanced","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"HashiCorp Vault","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/hashicorp-vault"},"next":{"title":"Configuring the Go Runtime","permalink":"/oracle-db-appdev-monitoring/docs/next/advanced/go-runtime"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/6721cf4c.22c27e35.js b/docs/assets/js/c539bf3f.610db207.js similarity index 75% rename from docs/assets/js/6721cf4c.22c27e35.js rename to docs/assets/js/c539bf3f.610db207.js index 54cb68dc..36d4e853 100644 --- a/docs/assets/js/6721cf4c.22c27e35.js +++ b/docs/assets/js/c539bf3f.610db207.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[5361],{8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>o});var s=i(6540);const r={},t=s.createContext(r);function l(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(t.Provider,{value:n},e.children)}},9297:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"releases/changelog","title":"Changelog","description":"List of upcoming and historic changes to the exporter.","source":"@site/versioned_docs/version-2.1.0/releases/changelog.md","sourceDirName":"releases","slug":"/releases/changelog","permalink":"/oracle-db-appdev-monitoring/docs/releases/changelog","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/releases/changelog.md","tags":[],"version":"2.1.0","sidebarPosition":2,"frontMatter":{"title":"Changelog","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Roadmap","permalink":"/oracle-db-appdev-monitoring/docs/releases/roadmap"},"next":{"title":"Builds","permalink":"/oracle-db-appdev-monitoring/docs/releases/builds"}}');var r=i(4848),t=i(8453);const l={title:"Changelog",sidebar_position:2},o="Release Notes",a={},d=[{value:"Next, in-development",id:"next-in-development",level:3},{value:"Version 2.1.0, September 29, 2025",id:"version-210-september-29-2025",level:3},{value:"Version 2.0.4, September 8, 2025",id:"version-204-september-8-2025",level:3},{value:"Version 2.0.3, August 27, 2025",id:"version-203-august-27-2025",level:3},{value:"Version 2.0.2, June 24, 2025",id:"version-202-june-24-2025",level:3},{value:"Version 2.0.1, June 12, 2025",id:"version-201-june-12-2025",level:3},{value:"Version 2.0.0, May 27, 2025",id:"version-200-may-27-2025",level:3},{value:"Version 1.6.1, May 2, 2025",id:"version-161-may-2-2025",level:3},{value:"Version 1.6.0, April 18, 2025",id:"version-160-april-18-2025",level:3},{value:"Version 1.5.5, March 13, 2025",id:"version-155-march-13-2025",level:3},{value:"Version 1.5.4, March 3, 2025",id:"version-154-march-3-2025",level:3},{value:"Version 1.5.3, January 28, 2025",id:"version-153-january-28-2025",level:3},{value:"Version 1.5.2, December 2, 2024",id:"version-152-december-2-2024",level:3},{value:"Version 1.5.1, October 28, 2024",id:"version-151-october-28-2024",level:3},{value:"Version 1.5.0, September 26, 2024",id:"version-150-september-26-2024",level:3},{value:"Version 1.4.0, September 4, 2024",id:"version-140-september-4-2024",level:3},{value:"Version 1.3.1, July 22, 2024",id:"version-131-july-22-2024",level:3},{value:"Version 1.3.0, June 7, 2024",id:"version-130-june-7-2024",level:3},{value:"Version 1.2.1, April 16, 2024",id:"version-121-april-16-2024",level:3},{value:"Version 1.2.0, January 17, 2024",id:"version-120-january-17-2024",level:3},{value:"Version 1.1.1, November 28, 2023",id:"version-111-november-28-2023",level:3},{value:"Version 1.1, October 27, 2023",id:"version-11-october-27-2023",level:3},{value:"Version 1.0, September 13, 2023",id:"version-10-september-13-2023",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"release-notes",children:"Release Notes"})}),"\n",(0,r.jsx)(n.p,{children:"List of upcoming and historic changes to the exporter."}),"\n",(0,r.jsx)(n.h3,{id:"next-in-development",children:"Next, in-development"}),"\n",(0,r.jsx)(n.p,{children:"Our current priorities to support metrics for advanced database features and use cases, like Exadata, GoldenGate, and views included in the Oracle Diagnostics Pack."}),"\n",(0,r.jsx)(n.h3,{id:"version-210-september-29-2025",children:"Version 2.1.0, September 29, 2025"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Updated project dependencies."}),"\n",(0,r.jsx)(n.li,{children:"Standardize multi-arch builds and document supported database versions."}),"\n",(0,r.jsx)(n.li,{children:"The metrics override capability is extended, allowing users to redefine individual existing metrics in custom metrics files. This allows users to modify individual default metrics without wholly replacing the default metrics file."}),"\n",(0,r.jsx)(n.li,{children:"If the exporter fails to connect to a database due to invalid or locked credentials (ORA-01017 or ORA-28000 errors), that database configuration will be invalidated and the exporter will not attempt to re-establish the database connection. Other databases will continue to be scraped."}),"\n",(0,r.jsxs)(n.li,{children:["Metrics with an empty databases array (",(0,r.jsx)(n.code,{children:"databases = []"}),") are now considered disabled, and will not be scraped."]}),"\n",(0,r.jsxs)(n.li,{children:["Increased the default query timeout for the ",(0,r.jsx)(n.code,{children:"top_sql"})," metric to 10 seconds (previously 5 seconds)."]}),"\n",(0,r.jsxs)(n.li,{children:["Metrics using the ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," property will no longer be scraped on every request if they have a cached value. This only applies when the metrics exporter is configured to scrape metrics ",(0,r.jsx)(n.em,{children:"on request"}),", rather than on a global interval."]}),"\n",(0,r.jsxs)(n.li,{children:["Metrics using the ",(0,r.jsx)(n.code,{children:"fieldtoappend"})," property now support labels. The ",(0,r.jsx)(n.code,{children:"wait_time"})," and ",(0,r.jsx)(n.code,{children:"activity"})," default metrics use the ",(0,r.jsx)(n.code,{children:"fieldtoappend"})," property, and now properly display their labels."]}),"\n",(0,r.jsxs)(n.li,{children:["Fix ",(0,r.jsx)(n.code,{children:"wait_time"})," default metric to work with Oracle Database 19c."]}),"\n",(0,r.jsx)(n.li,{children:"Fix an issue where the exporter would unnecessarily scrape metrics with a custom scrape interval."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/romankspb",children:"@romankspb"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/muhammadabdullah-amjad",children:"@muhammadabdullah-amjad"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/MansuyDavid",children:"@MansuyDavid"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/borkoz",children:"@borkoz"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/ristagg",children:"@ristagg"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-204-september-8-2025",children:"Version 2.0.4, September 8, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Added WARN logging when database configurations are duplicated in the exporter configuration."}),"\n",(0,r.jsxs)(n.li,{children:["Added INST_ID to ",(0,r.jsx)(n.code,{children:"gv$"})," query metrics as a label."]}),"\n",(0,r.jsx)(n.li,{children:"Fixed multiple concurrency bugs when the exporter is connected to multiple databases and using a custom scrape interval."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Supporterino",children:"@Supporterino"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/msafdal",children:"@msafdal"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aberinnj",children:"@aberinnj"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-203-august-27-2025",children:"Version 2.0.3, August 27, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Enable configuration of the prometheus webserver from the config file using the ",(0,r.jsx)(n.code,{children:"web"})," prefix."]}),"\n",(0,r.jsx)(n.li,{children:"Allow loading of database password(s) from a file."}),"\n",(0,r.jsx)(n.li,{children:"Fixed a bug where database type (CDB, PDB, etc.) was not reported in certain situations."}),"\n",(0,r.jsxs)(n.li,{children:["Fixed a bug where literal passwords containing the '$' character (in the config file) would be evaluated as environment variables. To use literal passwords with the '$' character, escape the '$' character with a second '$': ",(0,r.jsx)(n.code,{children:"$test$pwd"})," becomes ",(0,r.jsx)(n.code,{children:"$$test$$pwd"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Fixed a bug when using ",(0,r.jsx)(n.code,{children:"metrics.scrapeInterval"})," combined with per-metric scrape intervals that made the available metrics data set inconsistent."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Supporterino",children:"@Supporterino"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aberinnj",children:"@aberinnj"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/redelang",children:"@redelang"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/qrkop",children:"@qrkop"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/KevDi",children:"@KevDi"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/bomuva",children:"@bomuva"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/anilmoris",children:"@anilmoris"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Sycri",children:"@Sycri"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/kizuna-lek",children:"@kizuna-lek"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rfrozza",children:"@rfrozza"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-202-june-24-2025",children:"Version 2.0.2, June 24, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Fixed a case-sensitive issue with resource name in the default metrics file."}),"\n",(0,r.jsx)(n.li,{children:"Add query timeouts to initial database connections, which could cause the exporter to hang in multi-database configurations"}),"\n",(0,r.jsx)(n.li,{children:"Fix an issue where rapidly acquiring connections could cause the exporter to crash. This was more common in multi-database configurations, due to the increased number of connection pools."}),"\n",(0,r.jsx)(n.li,{children:"Update some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rfrozza",children:"@rfrozza"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rafal-szypulka",children:"@rafal-szypulka"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/darkelfit",children:"@darkelfit"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-201-june-12-2025",children:"Version 2.0.1, June 12, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Use gv$ views instead of v$ views to allow collection of metrics from all instances in a cluster. (In preparation for RAC support)."}),"\n",(0,r.jsx)(n.li,{children:"Update some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-200-may-27-2025",children:"Version 2.0.0, May 27, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Fixed an issue with ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," that could cause metrics not to be scraped (#172, #176)."]}),"\n",(0,r.jsxs)(n.li,{children:["Added configuration through a YAML file, passed using the ",(0,r.jsx)(n.code,{children:"--config.file"})," command-line argument. Backwards compatibility is maintained for the command-line arguments, through it is recommended to use the configuration file from the 2.0.0 release onward. It is not recommended to use a combination of command-line arguments and the configuration file."]}),"\n",(0,r.jsx)(n.li,{children:"Added support for multiple databases through the configuration file. As many database instances may be specified as needed, which will be scraped concurrently (#89)."}),"\n",(0,r.jsx)(n.li,{children:"Updated provided dashboards."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-161-may-2-2025",children:"Version 1.6.1, May 2, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Deepak A."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-160-april-18-2025",children:"Version 1.6.0, April 18, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Added support for Azure Key Vault (#200)."}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/4Aiur",children:"4Aiur"})," added missing grants for alert log to the demo environment (#207)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Brian, Damian et al."}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/4Aiur",children:"4Aiur"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-155-march-13-2025",children:"Version 1.5.5, March 13, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/VictorErmakov",children:"@VictorErmakov"})," updated the docker-compose sample with connection pool parameters to avoid fast connect cycling (#191)."]}),"\n",(0,r.jsx)(n.li,{children:"Update default values for connection pool parameters to use go-sql pooling by default to avoid fast connet cycling."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/VictorErmakov",children:"@VictorErmakov"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-154-march-3-2025",children:"Version 1.5.4, March 3, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Based of this recommendation from ",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror?tab=readme-ov-file#pooling",children:"godror"}),", which relates to the two following items, and in discussion with the ODPI-C team, we have introduced additional parameters to allow you to set connection pool parameters, and have set defaults which will avoid fast connect cycling. It is our expectation that a fix may be produced in the underlying ODPI-C library for the underlying issue. In the mean time, these changes will avoid the conditions under which the error can occur."]}),"\n",(0,r.jsx)(n.li,{children:"Fix malloc error (#177, #181)."}),"\n",(0,r.jsx)(n.li,{children:"Fix intermittent connection issues with ADB-S when exporter is run in a container (#169)."}),"\n",(0,r.jsx)(n.li,{children:"Fix Multiple custom metrics files overwrite one another (#179)."}),"\n",(0,r.jsx)(n.li,{children:"Replace go-kit/log with log/slog, due to upstream changes in prometheus/common."}),"\n",(0,r.jsxs)(n.li,{children:["Add support for additional admin roles, expanding list of options for ",(0,r.jsx)(n.code,{children:"DB_ROLE"})," to ",(0,r.jsx)(n.code,{children:"SYSDBA"}),", ",(0,r.jsx)(n.code,{children:"SYSOPER"}),", ",(0,r.jsx)(n.code,{children:"SYSBACKUP"}),", ",(0,r.jsx)(n.code,{children:"SYSDG"}),", ",(0,r.jsx)(n.code,{children:"SYSKM"}),", ",(0,r.jsx)(n.code,{children:"SYSRAC"})," and ",(0,r.jsx)(n.code,{children:"SYSASM"})," (#180)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Jman1993",children:"@Jman1993"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/oey",children:"@oey"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/jlembeck06",children:"@jlembeck06"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Jman1993",children:"@Jman1993"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/PeterP55P",children:"@PeterP55P"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rlagyu0",children:"@rlagyu0"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Sycri",children:"@Sycri"})}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Thank you to ",(0,r.jsx)(n.a,{href:"https://github.com/tgulacsi",children:"@tgulacsi"})," for changes in godror (",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror/issues/361",children:"https://github.com/godror/godror/issues/361"}),", ",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror/issues/360",children:"https://github.com/godror/godror/issues/360"}),"), and to ",(0,r.jsx)(n.a,{href:"https://github.com/cjbj",children:"@cjbj"})," and ",(0,r.jsx)(n.a,{href:"https://github.com/sudarshan12s",children:"@sudarshan12s"})," for support and guidance from ODPI-C (",(0,r.jsx)(n.a,{href:"https://github.com/oracle/odpi",children:"https://github.com/oracle/odpi"}),")."]}),"\n",(0,r.jsx)(n.p,{children:"In this release, we also continued some minor code refactoring."}),"\n",(0,r.jsx)(n.h3,{id:"version-153-january-28-2025",children:"Version 1.5.3, January 28, 2025"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:"Known issue"}),": This release has a known issue that results in the error message ",(0,r.jsx)(n.code,{children:"malloc(): unsorted double linked list corrupted"}),".\nWe recommend staying on 1.5.2 until a new release with a fix is available. We hope to have a fix by early March."]}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Fix over-zealous supression of errors when ",(0,r.jsx)(n.code,{children:"ignorezeroresult = true"})," (#168)."]}),"\n",(0,r.jsxs)(n.li,{children:["When ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," is set, do first scrape immediately, not after the interval (#166)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/redelang",children:"@redelang"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"In this release, we also started some minor code refactoring."}),"\n",(0,r.jsx)(n.h3,{id:"version-152-december-2-2024",children:"Version 1.5.2, December 2, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Update the metric defintion for tablespace usage to report more accurate temp space usage."}),"\n",(0,r.jsx)(n.li,{children:"Revert InstantClient to 21c version due to ADB connectivity issue."}),"\n",(0,r.jsx)(n.li,{children:"Update documentation to explain how to obtain credentials from a wallet."}),"\n",(0,r.jsx)(n.li,{children:"Fix race condition on err variable in scrape() func (by @valrusu)."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aureliocirella",children:"@aureliocirella"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/mitoeth",children:"@mitoeth"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/valrusu",children:"@valrusu"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-151-october-28-2024",children:"Version 1.5.1, October 28, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Added support for using the ",(0,r.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable, which fixes an issue when connecting to Autonomous Database instances using TNS name."]}),"\n",(0,r.jsx)(n.li,{children:"Updated InstantClient to 23ai version for amd64 and latest available 19.24 version for arm64."}),"\n",(0,r.jsxs)(n.li,{children:["Fixed an issue with wrong ",(0,r.jsx)(n.code,{children:"LD_LIBRARY_PATH"})," on some platforms. (#136)"]}),"\n",(0,r.jsxs)(n.li,{children:["Added documentation and an example of using the ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," setting to change the interval at which a certain metric is colected."]}),"\n",(0,r.jsx)(n.li,{children:"Added notes to documentation for extra security parameters needed when using a wallet with Podman."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-150-september-26-2024",children:"Version 1.5.0, September 26, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Support for running the exporter on ARM processors (darwin and linux)."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n",(0,r.jsx)(n.li,{children:'Updated the "test/demo environment" to use newer version of Oracle Database (23.5.0.24.07) and faster startup.'}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-140-september-4-2024",children:"Version 1.4.0, September 4, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Allow multiple custom metrics definition files."}),"\n",(0,r.jsx)(n.li,{children:"Allow query timeout per-metric."}),"\n",(0,r.jsx)(n.li,{children:"Allow scrape interval per-metric."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-131-july-22-2024",children:"Version 1.3.1, July 22, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Alert logs can be disabled by setting parameter ",(0,r.jsx)(n.code,{children:"log.disable"})," to ",(0,r.jsx)(n.code,{children:"1"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"Alert log exporter will stop if it gets three consecutive failures."}),"\n",(0,r.jsx)(n.li,{children:"Updated the list of required permissions."}),"\n",(0,r.jsx)(n.li,{children:"Updated the TxEventQ sample dashboard."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/tux-jochen",children:"@tux-jochen"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-130-june-7-2024",children:"Version 1.3.0, June 7, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Alert logs can be exported for collection by a log reader like Promtail or FluentBit. Default\noutput to ",(0,r.jsx)(n.code,{children:"/log/alert.log"})," in JSON format."]}),"\n",(0,r.jsx)(n.li,{children:"Provide ability to connect as SYSDBA or SYSOPER by setting DB_ROLE."}),"\n",(0,r.jsx)(n.li,{children:"New default metric is added to report the type of database connected to (CDB or PDB)."}),"\n",(0,r.jsx)(n.li,{children:"New default metrics are added for cache hit ratios."}),"\n",(0,r.jsx)(n.li,{children:"Default metrics updated to suppress spurious warnings in log."}),"\n",(0,r.jsx)(n.li,{children:"Wait class metric updated to use a better query."}),"\n",(0,r.jsx)(n.li,{children:"The sample dashboard is updated to include new metrics."}),"\n",(0,r.jsx)(n.li,{children:"Fixed a bug which prevented periodic freeing of memory."}),"\n",(0,r.jsx)(n.li,{children:"Set CLIENT_INFO to a meaningful value."}),"\n",(0,r.jsx)(n.li,{children:"Update Go toolchain to 1.22.4."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/pioro",children:"@pioro"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/savoir81",children:"@savoir81"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-121-april-16-2024",children:"Version 1.2.1, April 16, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Accept max idle and open connections settings as parameters."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-120-january-17-2024",children:"Version 1.2.0, January 17, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Introduced a new feature to periodically restart the process if requested."}),"\n",(0,r.jsx)(n.li,{children:"Introduced a new feature to periodically attempt to free OS memory if requested."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-111-november-28-2023",children:"Version 1.1.1, November 28, 2023"}),"\n",(0,r.jsx)(n.p,{children:"This release just updates some third-party dependencies."}),"\n",(0,r.jsx)(n.h3,{id:"version-11-october-27-2023",children:"Version 1.1, October 27, 2023"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The query for the standard metric ",(0,r.jsx)(n.code,{children:"wait_class"})," has been updated so that it will work in both container databases\nand pluggable databases, including in Oracle Autonomous Database instances. Note that this query will not return\nany data unless the database instance is under load."]}),"\n",(0,r.jsxs)(n.li,{children:["Support for reading the database password from OCI Vault has been added (see ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/oci-vault",children:"details"}),")"]}),"\n",(0,r.jsx)(n.li,{children:"Log messages have been improved"}),"\n",(0,r.jsx)(n.li,{children:"Some dependencies have been updated"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-10-september-13-2023",children:"Version 1.0, September 13, 2023"}),"\n",(0,r.jsx)(n.p,{children:"The first production release, v1.0, includes the following features:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A number of ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/getting-started/default-metrics",children:"standard metrics"})," are exposed,"]}),"\n",(0,r.jsxs)(n.li,{children:["Users can define ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics",children:"custom metrics"}),","]}),"\n",(0,r.jsx)(n.li,{children:"Oracle regularly reviews third-party licenses and scans the code and images, including transitive/recursive dependencies for issues,"}),"\n",(0,r.jsx)(n.li,{children:"Connection to Oracle can be a basic connection or use an Oracle Wallet and TLS - connection to Oracle Autonomous Database is supported,"}),"\n",(0,r.jsx)(n.li,{children:"Metrics for Oracle Transactional Event Queues are also supported,"}),"\n",(0,r.jsx)(n.li,{children:"A Grafana dashboard is provided for Transactional Event Queues, and"}),"\n",(0,r.jsx)(n.li,{children:"A pre-built container image is provided, based on Oracle Linux, and optimized for size and security."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Note that this exporter uses a different Oracle Database driver which in turn uses code directly written by Oracle to access the database. This driver does require an Oracle client. In this initial release, the client is bundled into the container image, however we intend to make that optional in order to minimize the image size."}),"\n",(0,r.jsx)(n.p,{children:"The interfaces for this version have been kept as close as possible to those of earlier alpha releases in this repository to assist with migration. However, it should be expected that there may be breaking changes in future releases."})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[9100],{1432:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"releases/changelog","title":"Changelog","description":"List of upcoming and historic changes to the exporter.","source":"@site/docs/releases/changelog.md","sourceDirName":"releases","slug":"/releases/changelog","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/changelog","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/releases/changelog.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Changelog","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Roadmap","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/roadmap"},"next":{"title":"Builds","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/builds"}}');var r=i(4848),t=i(8453);const l={title:"Changelog",sidebar_position:2},o="Release Notes",a={},d=[{value:"Next, in-development",id:"next-in-development",level:3},{value:"Version 2.2.0, October 28, 2025",id:"version-220-october-28-2025",level:3},{value:"Version 2.1.0, September 29, 2025",id:"version-210-september-29-2025",level:3},{value:"Version 2.0.4, September 8, 2025",id:"version-204-september-8-2025",level:3},{value:"Version 2.0.3, August 27, 2025",id:"version-203-august-27-2025",level:3},{value:"Version 2.0.2, June 24, 2025",id:"version-202-june-24-2025",level:3},{value:"Version 2.0.1, June 12, 2025",id:"version-201-june-12-2025",level:3},{value:"Version 2.0.0, May 27, 2025",id:"version-200-may-27-2025",level:3},{value:"Version 1.6.1, May 2, 2025",id:"version-161-may-2-2025",level:3},{value:"Version 1.6.0, April 18, 2025",id:"version-160-april-18-2025",level:3},{value:"Version 1.5.5, March 13, 2025",id:"version-155-march-13-2025",level:3},{value:"Version 1.5.4, March 3, 2025",id:"version-154-march-3-2025",level:3},{value:"Version 1.5.3, January 28, 2025",id:"version-153-january-28-2025",level:3},{value:"Version 1.5.2, December 2, 2024",id:"version-152-december-2-2024",level:3},{value:"Version 1.5.1, October 28, 2024",id:"version-151-october-28-2024",level:3},{value:"Version 1.5.0, September 26, 2024",id:"version-150-september-26-2024",level:3},{value:"Version 1.4.0, September 4, 2024",id:"version-140-september-4-2024",level:3},{value:"Version 1.3.1, July 22, 2024",id:"version-131-july-22-2024",level:3},{value:"Version 1.3.0, June 7, 2024",id:"version-130-june-7-2024",level:3},{value:"Version 1.2.1, April 16, 2024",id:"version-121-april-16-2024",level:3},{value:"Version 1.2.0, January 17, 2024",id:"version-120-january-17-2024",level:3},{value:"Version 1.1.1, November 28, 2023",id:"version-111-november-28-2023",level:3},{value:"Version 1.1, October 27, 2023",id:"version-11-october-27-2023",level:3},{value:"Version 1.0, September 13, 2023",id:"version-10-september-13-2023",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"release-notes",children:"Release Notes"})}),"\n",(0,r.jsx)(n.p,{children:"List of upcoming and historic changes to the exporter."}),"\n",(0,r.jsx)(n.h3,{id:"next-in-development",children:"Next, in-development"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"TBD"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-220-october-28-2025",children:"Version 2.2.0, October 28, 2025"}),"\n",(0,r.jsx)(n.p,{children:"Our current priorities to support metrics for advanced database features and use cases, like Exadata, GoldenGate, and views included in the Oracle Diagnostics Pack."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Allow loading database credentials from ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/hashicorp-vault",children:"HashiCorp Vault"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Added experimental support for the ",(0,r.jsx)(n.a,{href:"https://github.com/sijms/go-ora",children:"go-ora"})]}),"\n",(0,r.jsxs)(n.li,{children:["Move ",(0,r.jsx)(n.code,{children:"oracledb_dbtype"})," metric to the default metrics. You may now disable or override this metric like any other database metric."]}),"\n",(0,r.jsx)(n.li,{children:"Document required database permissions for the exporter."}),"\n",(0,r.jsx)(n.li,{children:"Fix an issue where some metrics would not be cached when using a per-metric scrape interval with a global scrape interval."}),"\n",(0,r.jsx)(n.li,{children:"Update third party dependencies"}),"\n",(0,r.jsx)(n.li,{children:"Update Go runtime to 1.24.9"}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/MansuyDavid",children:"@MansuyDavid"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/jdagemark",children:"@jdagemark"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/ilmarkerm",children:"@ilmarkerm"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-210-september-29-2025",children:"Version 2.1.0, September 29, 2025"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Updated project dependencies."}),"\n",(0,r.jsx)(n.li,{children:"Standardize multi-arch builds and document supported database versions."}),"\n",(0,r.jsx)(n.li,{children:"The metrics override capability is extended, allowing users to redefine individual existing metrics in custom metrics files. This allows users to modify individual default metrics without wholly replacing the default metrics file."}),"\n",(0,r.jsx)(n.li,{children:"If the exporter fails to connect to a database due to invalid or locked credentials (ORA-01017 or ORA-28000 errors), that database configuration will be invalidated and the exporter will not attempt to re-establish the database connection. Other databases will continue to be scraped."}),"\n",(0,r.jsxs)(n.li,{children:["Metrics with an empty databases array (",(0,r.jsx)(n.code,{children:"databases = []"}),") are now considered disabled, and will not be scraped."]}),"\n",(0,r.jsxs)(n.li,{children:["Increased the default query timeout for the ",(0,r.jsx)(n.code,{children:"top_sql"})," metric to 10 seconds (previously 5 seconds)."]}),"\n",(0,r.jsxs)(n.li,{children:["Metrics using the ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," property will no longer be scraped on every request if they have a cached value. This only applies when the metrics exporter is configured to scrape metrics ",(0,r.jsx)(n.em,{children:"on request"}),", rather than on a global interval."]}),"\n",(0,r.jsxs)(n.li,{children:["Metrics using the ",(0,r.jsx)(n.code,{children:"fieldtoappend"})," property now support labels. The ",(0,r.jsx)(n.code,{children:"wait_time"})," and ",(0,r.jsx)(n.code,{children:"activity"})," default metrics use the ",(0,r.jsx)(n.code,{children:"fieldtoappend"})," property, and now properly display their labels."]}),"\n",(0,r.jsxs)(n.li,{children:["Fix ",(0,r.jsx)(n.code,{children:"wait_time"})," default metric to work with Oracle Database 19c."]}),"\n",(0,r.jsx)(n.li,{children:"Fix an issue where the exporter would unnecessarily scrape metrics with a custom scrape interval."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/romankspb",children:"@romankspb"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/muhammadabdullah-amjad",children:"@muhammadabdullah-amjad"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/MansuyDavid",children:"@MansuyDavid"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/borkoz",children:"@borkoz"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/ristagg",children:"@ristagg"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-204-september-8-2025",children:"Version 2.0.4, September 8, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Added WARN logging when database configurations are duplicated in the exporter configuration."}),"\n",(0,r.jsxs)(n.li,{children:["Added INST_ID to ",(0,r.jsx)(n.code,{children:"gv$"})," query metrics as a label."]}),"\n",(0,r.jsx)(n.li,{children:"Fixed multiple concurrency bugs when the exporter is connected to multiple databases and using a custom scrape interval."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Supporterino",children:"@Supporterino"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/msafdal",children:"@msafdal"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aberinnj",children:"@aberinnj"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-203-august-27-2025",children:"Version 2.0.3, August 27, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Enable configuration of the prometheus webserver from the config file using the ",(0,r.jsx)(n.code,{children:"web"})," prefix."]}),"\n",(0,r.jsx)(n.li,{children:"Allow loading of database password(s) from a file."}),"\n",(0,r.jsx)(n.li,{children:"Fixed a bug where database type (CDB, PDB, etc.) was not reported in certain situations."}),"\n",(0,r.jsxs)(n.li,{children:["Fixed a bug where literal passwords containing the '$' character (in the config file) would be evaluated as environment variables. To use literal passwords with the '$' character, escape the '$' character with a second '$': ",(0,r.jsx)(n.code,{children:"$test$pwd"})," becomes ",(0,r.jsx)(n.code,{children:"$$test$$pwd"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Fixed a bug when using ",(0,r.jsx)(n.code,{children:"metrics.scrapeInterval"})," combined with per-metric scrape intervals that made the available metrics data set inconsistent."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Supporterino",children:"@Supporterino"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aberinnj",children:"@aberinnj"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/redelang",children:"@redelang"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/qrkop",children:"@qrkop"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/KevDi",children:"@KevDi"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/bomuva",children:"@bomuva"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/anilmoris",children:"@anilmoris"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Sycri",children:"@Sycri"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/kizuna-lek",children:"@kizuna-lek"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rfrozza",children:"@rfrozza"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-202-june-24-2025",children:"Version 2.0.2, June 24, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Fixed a case-sensitive issue with resource name in the default metrics file."}),"\n",(0,r.jsx)(n.li,{children:"Add query timeouts to initial database connections, which could cause the exporter to hang in multi-database configurations"}),"\n",(0,r.jsx)(n.li,{children:"Fix an issue where rapidly acquiring connections could cause the exporter to crash. This was more common in multi-database configurations, due to the increased number of connection pools."}),"\n",(0,r.jsx)(n.li,{children:"Update some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rfrozza",children:"@rfrozza"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rafal-szypulka",children:"@rafal-szypulka"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/darkelfit",children:"@darkelfit"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-201-june-12-2025",children:"Version 2.0.1, June 12, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Use gv$ views instead of v$ views to allow collection of metrics from all instances in a cluster. (In preparation for RAC support)."}),"\n",(0,r.jsx)(n.li,{children:"Update some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-200-may-27-2025",children:"Version 2.0.0, May 27, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Fixed an issue with ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," that could cause metrics not to be scraped (#172, #176)."]}),"\n",(0,r.jsxs)(n.li,{children:["Added configuration through a YAML file, passed using the ",(0,r.jsx)(n.code,{children:"--config.file"})," command-line argument. Backwards compatibility is maintained for the command-line arguments, through it is recommended to use the configuration file from the 2.0.0 release onward. It is not recommended to use a combination of command-line arguments and the configuration file."]}),"\n",(0,r.jsx)(n.li,{children:"Added support for multiple databases through the configuration file. As many database instances may be specified as needed, which will be scraped concurrently (#89)."}),"\n",(0,r.jsx)(n.li,{children:"Updated provided dashboards."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-161-may-2-2025",children:"Version 1.6.1, May 2, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Deepak A."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-160-april-18-2025",children:"Version 1.6.0, April 18, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Added support for Azure Key Vault (#200)."}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/4Aiur",children:"4Aiur"})," added missing grants for alert log to the demo environment (#207)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Brian, Damian et al."}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/4Aiur",children:"4Aiur"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-155-march-13-2025",children:"Version 1.5.5, March 13, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/VictorErmakov",children:"@VictorErmakov"})," updated the docker-compose sample with connection pool parameters to avoid fast connect cycling (#191)."]}),"\n",(0,r.jsx)(n.li,{children:"Update default values for connection pool parameters to use go-sql pooling by default to avoid fast connet cycling."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/VictorErmakov",children:"@VictorErmakov"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-154-march-3-2025",children:"Version 1.5.4, March 3, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Based of this recommendation from ",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror?tab=readme-ov-file#pooling",children:"godror"}),", which relates to the two following items, and in discussion with the ODPI-C team, we have introduced additional parameters to allow you to set connection pool parameters, and have set defaults which will avoid fast connect cycling. It is our expectation that a fix may be produced in the underlying ODPI-C library for the underlying issue. In the mean time, these changes will avoid the conditions under which the error can occur."]}),"\n",(0,r.jsx)(n.li,{children:"Fix malloc error (#177, #181)."}),"\n",(0,r.jsx)(n.li,{children:"Fix intermittent connection issues with ADB-S when exporter is run in a container (#169)."}),"\n",(0,r.jsx)(n.li,{children:"Fix Multiple custom metrics files overwrite one another (#179)."}),"\n",(0,r.jsx)(n.li,{children:"Replace go-kit/log with log/slog, due to upstream changes in prometheus/common."}),"\n",(0,r.jsxs)(n.li,{children:["Add support for additional admin roles, expanding list of options for ",(0,r.jsx)(n.code,{children:"DB_ROLE"})," to ",(0,r.jsx)(n.code,{children:"SYSDBA"}),", ",(0,r.jsx)(n.code,{children:"SYSOPER"}),", ",(0,r.jsx)(n.code,{children:"SYSBACKUP"}),", ",(0,r.jsx)(n.code,{children:"SYSDG"}),", ",(0,r.jsx)(n.code,{children:"SYSKM"}),", ",(0,r.jsx)(n.code,{children:"SYSRAC"})," and ",(0,r.jsx)(n.code,{children:"SYSASM"})," (#180)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Jman1993",children:"@Jman1993"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/oey",children:"@oey"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/jlembeck06",children:"@jlembeck06"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Jman1993",children:"@Jman1993"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/PeterP55P",children:"@PeterP55P"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rlagyu0",children:"@rlagyu0"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Sycri",children:"@Sycri"})}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Thank you to ",(0,r.jsx)(n.a,{href:"https://github.com/tgulacsi",children:"@tgulacsi"})," for changes in godror (",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror/issues/361",children:"https://github.com/godror/godror/issues/361"}),", ",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror/issues/360",children:"https://github.com/godror/godror/issues/360"}),"), and to ",(0,r.jsx)(n.a,{href:"https://github.com/cjbj",children:"@cjbj"})," and ",(0,r.jsx)(n.a,{href:"https://github.com/sudarshan12s",children:"@sudarshan12s"})," for support and guidance from ODPI-C (",(0,r.jsx)(n.a,{href:"https://github.com/oracle/odpi",children:"https://github.com/oracle/odpi"}),")."]}),"\n",(0,r.jsx)(n.p,{children:"In this release, we also continued some minor code refactoring."}),"\n",(0,r.jsx)(n.h3,{id:"version-153-january-28-2025",children:"Version 1.5.3, January 28, 2025"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:"Known issue"}),": This release has a known issue that results in the error message ",(0,r.jsx)(n.code,{children:"malloc(): unsorted double linked list corrupted"}),".\nWe recommend staying on 1.5.2 until a new release with a fix is available. We hope to have a fix by early March."]}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Fix over-zealous supression of errors when ",(0,r.jsx)(n.code,{children:"ignorezeroresult = true"})," (#168)."]}),"\n",(0,r.jsxs)(n.li,{children:["When ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," is set, do first scrape immediately, not after the interval (#166)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/redelang",children:"@redelang"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"In this release, we also started some minor code refactoring."}),"\n",(0,r.jsx)(n.h3,{id:"version-152-december-2-2024",children:"Version 1.5.2, December 2, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Update the metric defintion for tablespace usage to report more accurate temp space usage."}),"\n",(0,r.jsx)(n.li,{children:"Revert InstantClient to 21c version due to ADB connectivity issue."}),"\n",(0,r.jsx)(n.li,{children:"Update documentation to explain how to obtain credentials from a wallet."}),"\n",(0,r.jsx)(n.li,{children:"Fix race condition on err variable in scrape() func (by @valrusu)."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aureliocirella",children:"@aureliocirella"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/mitoeth",children:"@mitoeth"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/valrusu",children:"@valrusu"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-151-october-28-2024",children:"Version 1.5.1, October 28, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Added support for using the ",(0,r.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable, which fixes an issue when connecting to Autonomous Database instances using TNS name."]}),"\n",(0,r.jsx)(n.li,{children:"Updated InstantClient to 23ai version for amd64 and latest available 19.24 version for arm64."}),"\n",(0,r.jsxs)(n.li,{children:["Fixed an issue with wrong ",(0,r.jsx)(n.code,{children:"LD_LIBRARY_PATH"})," on some platforms. (#136)"]}),"\n",(0,r.jsxs)(n.li,{children:["Added documentation and an example of using the ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," setting to change the interval at which a certain metric is colected."]}),"\n",(0,r.jsx)(n.li,{children:"Added notes to documentation for extra security parameters needed when using a wallet with Podman."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-150-september-26-2024",children:"Version 1.5.0, September 26, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Support for running the exporter on ARM processors (darwin and linux)."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n",(0,r.jsx)(n.li,{children:'Updated the "test/demo environment" to use newer version of Oracle Database (23.5.0.24.07) and faster startup.'}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-140-september-4-2024",children:"Version 1.4.0, September 4, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Allow multiple custom metrics definition files."}),"\n",(0,r.jsx)(n.li,{children:"Allow query timeout per-metric."}),"\n",(0,r.jsx)(n.li,{children:"Allow scrape interval per-metric."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-131-july-22-2024",children:"Version 1.3.1, July 22, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Alert logs can be disabled by setting parameter ",(0,r.jsx)(n.code,{children:"log.disable"})," to ",(0,r.jsx)(n.code,{children:"1"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"Alert log exporter will stop if it gets three consecutive failures."}),"\n",(0,r.jsx)(n.li,{children:"Updated the list of required permissions."}),"\n",(0,r.jsx)(n.li,{children:"Updated the TxEventQ sample dashboard."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/tux-jochen",children:"@tux-jochen"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-130-june-7-2024",children:"Version 1.3.0, June 7, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Alert logs can be exported for collection by a log reader like Promtail or FluentBit. Default\noutput to ",(0,r.jsx)(n.code,{children:"/log/alert.log"})," in JSON format."]}),"\n",(0,r.jsx)(n.li,{children:"Provide ability to connect as SYSDBA or SYSOPER by setting DB_ROLE."}),"\n",(0,r.jsx)(n.li,{children:"New default metric is added to report the type of database connected to (CDB or PDB)."}),"\n",(0,r.jsx)(n.li,{children:"New default metrics are added for cache hit ratios."}),"\n",(0,r.jsx)(n.li,{children:"Default metrics updated to suppress spurious warnings in log."}),"\n",(0,r.jsx)(n.li,{children:"Wait class metric updated to use a better query."}),"\n",(0,r.jsx)(n.li,{children:"The sample dashboard is updated to include new metrics."}),"\n",(0,r.jsx)(n.li,{children:"Fixed a bug which prevented periodic freeing of memory."}),"\n",(0,r.jsx)(n.li,{children:"Set CLIENT_INFO to a meaningful value."}),"\n",(0,r.jsx)(n.li,{children:"Update Go toolchain to 1.22.4."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/pioro",children:"@pioro"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/savoir81",children:"@savoir81"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-121-april-16-2024",children:"Version 1.2.1, April 16, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Accept max idle and open connections settings as parameters."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-120-january-17-2024",children:"Version 1.2.0, January 17, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Introduced a new feature to periodically restart the process if requested."}),"\n",(0,r.jsx)(n.li,{children:"Introduced a new feature to periodically attempt to free OS memory if requested."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-111-november-28-2023",children:"Version 1.1.1, November 28, 2023"}),"\n",(0,r.jsx)(n.p,{children:"This release just updates some third-party dependencies."}),"\n",(0,r.jsx)(n.h3,{id:"version-11-october-27-2023",children:"Version 1.1, October 27, 2023"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The query for the standard metric ",(0,r.jsx)(n.code,{children:"wait_class"})," has been updated so that it will work in both container databases\nand pluggable databases, including in Oracle Autonomous Database instances. Note that this query will not return\nany data unless the database instance is under load."]}),"\n",(0,r.jsxs)(n.li,{children:["Support for reading the database password from OCI Vault has been added (see ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/oci-vault",children:"details"}),")"]}),"\n",(0,r.jsx)(n.li,{children:"Log messages have been improved"}),"\n",(0,r.jsx)(n.li,{children:"Some dependencies have been updated"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-10-september-13-2023",children:"Version 1.0, September 13, 2023"}),"\n",(0,r.jsx)(n.p,{children:"The first production release, v1.0, includes the following features:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A number of ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/getting-started/default-metrics",children:"standard metrics"})," are exposed,"]}),"\n",(0,r.jsxs)(n.li,{children:["Users can define ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/custom-metrics",children:"custom metrics"}),","]}),"\n",(0,r.jsx)(n.li,{children:"Oracle regularly reviews third-party licenses and scans the code and images, including transitive/recursive dependencies for issues,"}),"\n",(0,r.jsx)(n.li,{children:"Connection to Oracle can be a basic connection or use an Oracle Wallet and TLS - connection to Oracle Autonomous Database is supported,"}),"\n",(0,r.jsx)(n.li,{children:"Metrics for Oracle Transactional Event Queues are also supported,"}),"\n",(0,r.jsx)(n.li,{children:"A Grafana dashboard is provided for Transactional Event Queues, and"}),"\n",(0,r.jsx)(n.li,{children:"A pre-built container image is provided, based on Oracle Linux, and optimized for size and security."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Note that this exporter uses a different Oracle Database driver which in turn uses code directly written by Oracle to access the database. This driver does require an Oracle client. In this initial release, the client is bundled into the container image, however we intend to make that optional in order to minimize the image size."}),"\n",(0,r.jsx)(n.p,{children:"The interfaces for this version have been kept as close as possible to those of earlier alpha releases in this repository to assist with migration. However, it should be expected that there may be breaking changes in future releases."})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>o});var s=i(6540);const r={},t=s.createContext(r);function l(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/c539bf3f.6b61fa87.js b/docs/assets/js/c539bf3f.6b61fa87.js deleted file mode 100644 index f86a767e..00000000 --- a/docs/assets/js/c539bf3f.6b61fa87.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[9100],{1432:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"releases/changelog","title":"Changelog","description":"List of upcoming and historic changes to the exporter.","source":"@site/docs/releases/changelog.md","sourceDirName":"releases","slug":"/releases/changelog","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/changelog","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/releases/changelog.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Changelog","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Roadmap","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/roadmap"},"next":{"title":"Builds","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/builds"}}');var r=i(4848),t=i(8453);const l={title:"Changelog",sidebar_position:2},o="Release Notes",a={},d=[{value:"Next, in-development",id:"next-in-development",level:3},{value:"Version 2.1.0, September 29, 2025",id:"version-210-september-29-2025",level:3},{value:"Version 2.0.4, September 8, 2025",id:"version-204-september-8-2025",level:3},{value:"Version 2.0.3, August 27, 2025",id:"version-203-august-27-2025",level:3},{value:"Version 2.0.2, June 24, 2025",id:"version-202-june-24-2025",level:3},{value:"Version 2.0.1, June 12, 2025",id:"version-201-june-12-2025",level:3},{value:"Version 2.0.0, May 27, 2025",id:"version-200-may-27-2025",level:3},{value:"Version 1.6.1, May 2, 2025",id:"version-161-may-2-2025",level:3},{value:"Version 1.6.0, April 18, 2025",id:"version-160-april-18-2025",level:3},{value:"Version 1.5.5, March 13, 2025",id:"version-155-march-13-2025",level:3},{value:"Version 1.5.4, March 3, 2025",id:"version-154-march-3-2025",level:3},{value:"Version 1.5.3, January 28, 2025",id:"version-153-january-28-2025",level:3},{value:"Version 1.5.2, December 2, 2024",id:"version-152-december-2-2024",level:3},{value:"Version 1.5.1, October 28, 2024",id:"version-151-october-28-2024",level:3},{value:"Version 1.5.0, September 26, 2024",id:"version-150-september-26-2024",level:3},{value:"Version 1.4.0, September 4, 2024",id:"version-140-september-4-2024",level:3},{value:"Version 1.3.1, July 22, 2024",id:"version-131-july-22-2024",level:3},{value:"Version 1.3.0, June 7, 2024",id:"version-130-june-7-2024",level:3},{value:"Version 1.2.1, April 16, 2024",id:"version-121-april-16-2024",level:3},{value:"Version 1.2.0, January 17, 2024",id:"version-120-january-17-2024",level:3},{value:"Version 1.1.1, November 28, 2023",id:"version-111-november-28-2023",level:3},{value:"Version 1.1, October 27, 2023",id:"version-11-october-27-2023",level:3},{value:"Version 1.0, September 13, 2023",id:"version-10-september-13-2023",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"release-notes",children:"Release Notes"})}),"\n",(0,r.jsx)(n.p,{children:"List of upcoming and historic changes to the exporter."}),"\n",(0,r.jsx)(n.h3,{id:"next-in-development",children:"Next, in-development"}),"\n",(0,r.jsx)(n.p,{children:"Our current priorities to support metrics for advanced database features and use cases, like Exadata, GoldenGate, and views included in the Oracle Diagnostics Pack."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Move ",(0,r.jsx)(n.code,{children:"oracledb_dbtype"})," metric to the default metrics. You may now disable or override this metric like any other database metric."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/MansuyDavid",children:"@MansuyDavid"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-210-september-29-2025",children:"Version 2.1.0, September 29, 2025"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Updated project dependencies."}),"\n",(0,r.jsx)(n.li,{children:"Standardize multi-arch builds and document supported database versions."}),"\n",(0,r.jsx)(n.li,{children:"The metrics override capability is extended, allowing users to redefine individual existing metrics in custom metrics files. This allows users to modify individual default metrics without wholly replacing the default metrics file."}),"\n",(0,r.jsx)(n.li,{children:"If the exporter fails to connect to a database due to invalid or locked credentials (ORA-01017 or ORA-28000 errors), that database configuration will be invalidated and the exporter will not attempt to re-establish the database connection. Other databases will continue to be scraped."}),"\n",(0,r.jsxs)(n.li,{children:["Metrics with an empty databases array (",(0,r.jsx)(n.code,{children:"databases = []"}),") are now considered disabled, and will not be scraped."]}),"\n",(0,r.jsxs)(n.li,{children:["Increased the default query timeout for the ",(0,r.jsx)(n.code,{children:"top_sql"})," metric to 10 seconds (previously 5 seconds)."]}),"\n",(0,r.jsxs)(n.li,{children:["Metrics using the ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," property will no longer be scraped on every request if they have a cached value. This only applies when the metrics exporter is configured to scrape metrics ",(0,r.jsx)(n.em,{children:"on request"}),", rather than on a global interval."]}),"\n",(0,r.jsxs)(n.li,{children:["Metrics using the ",(0,r.jsx)(n.code,{children:"fieldtoappend"})," property now support labels. The ",(0,r.jsx)(n.code,{children:"wait_time"})," and ",(0,r.jsx)(n.code,{children:"activity"})," default metrics use the ",(0,r.jsx)(n.code,{children:"fieldtoappend"})," property, and now properly display their labels."]}),"\n",(0,r.jsxs)(n.li,{children:["Fix ",(0,r.jsx)(n.code,{children:"wait_time"})," default metric to work with Oracle Database 19c."]}),"\n",(0,r.jsx)(n.li,{children:"Fix an issue where the exporter would unnecessarily scrape metrics with a custom scrape interval."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/romankspb",children:"@romankspb"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/muhammadabdullah-amjad",children:"@muhammadabdullah-amjad"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/MansuyDavid",children:"@MansuyDavid"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/borkoz",children:"@borkoz"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/ristagg",children:"@ristagg"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-204-september-8-2025",children:"Version 2.0.4, September 8, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Added WARN logging when database configurations are duplicated in the exporter configuration."}),"\n",(0,r.jsxs)(n.li,{children:["Added INST_ID to ",(0,r.jsx)(n.code,{children:"gv$"})," query metrics as a label."]}),"\n",(0,r.jsx)(n.li,{children:"Fixed multiple concurrency bugs when the exporter is connected to multiple databases and using a custom scrape interval."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Supporterino",children:"@Supporterino"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/msafdal",children:"@msafdal"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aberinnj",children:"@aberinnj"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-203-august-27-2025",children:"Version 2.0.3, August 27, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Enable configuration of the prometheus webserver from the config file using the ",(0,r.jsx)(n.code,{children:"web"})," prefix."]}),"\n",(0,r.jsx)(n.li,{children:"Allow loading of database password(s) from a file."}),"\n",(0,r.jsx)(n.li,{children:"Fixed a bug where database type (CDB, PDB, etc.) was not reported in certain situations."}),"\n",(0,r.jsxs)(n.li,{children:["Fixed a bug where literal passwords containing the '$' character (in the config file) would be evaluated as environment variables. To use literal passwords with the '$' character, escape the '$' character with a second '$': ",(0,r.jsx)(n.code,{children:"$test$pwd"})," becomes ",(0,r.jsx)(n.code,{children:"$$test$$pwd"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Fixed a bug when using ",(0,r.jsx)(n.code,{children:"metrics.scrapeInterval"})," combined with per-metric scrape intervals that made the available metrics data set inconsistent."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Supporterino",children:"@Supporterino"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aberinnj",children:"@aberinnj"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/redelang",children:"@redelang"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/qrkop",children:"@qrkop"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/KevDi",children:"@KevDi"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/bomuva",children:"@bomuva"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/anilmoris",children:"@anilmoris"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Sycri",children:"@Sycri"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/kizuna-lek",children:"@kizuna-lek"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rfrozza",children:"@rfrozza"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-202-june-24-2025",children:"Version 2.0.2, June 24, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Fixed a case-sensitive issue with resource name in the default metrics file."}),"\n",(0,r.jsx)(n.li,{children:"Add query timeouts to initial database connections, which could cause the exporter to hang in multi-database configurations"}),"\n",(0,r.jsx)(n.li,{children:"Fix an issue where rapidly acquiring connections could cause the exporter to crash. This was more common in multi-database configurations, due to the increased number of connection pools."}),"\n",(0,r.jsx)(n.li,{children:"Update some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rfrozza",children:"@rfrozza"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/neilschelly",children:"@neilschelly"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rafal-szypulka",children:"@rafal-szypulka"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/darkelfit",children:"@darkelfit"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-201-june-12-2025",children:"Version 2.0.1, June 12, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Use gv$ views instead of v$ views to allow collection of metrics from all instances in a cluster. (In preparation for RAC support)."}),"\n",(0,r.jsx)(n.li,{children:"Update some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-200-may-27-2025",children:"Version 2.0.0, May 27, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Fixed an issue with ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," that could cause metrics not to be scraped (#172, #176)."]}),"\n",(0,r.jsxs)(n.li,{children:["Added configuration through a YAML file, passed using the ",(0,r.jsx)(n.code,{children:"--config.file"})," command-line argument. Backwards compatibility is maintained for the command-line arguments, through it is recommended to use the configuration file from the 2.0.0 release onward. It is not recommended to use a combination of command-line arguments and the configuration file."]}),"\n",(0,r.jsx)(n.li,{children:"Added support for multiple databases through the configuration file. As many database instances may be specified as needed, which will be scraped concurrently (#89)."}),"\n",(0,r.jsx)(n.li,{children:"Updated provided dashboards."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-161-may-2-2025",children:"Version 1.6.1, May 2, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Deepak A."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-160-april-18-2025",children:"Version 1.6.0, April 18, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Added support for Azure Key Vault (#200)."}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/4Aiur",children:"4Aiur"})," added missing grants for alert log to the demo environment (#207)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Brian, Damian et al."}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/4Aiur",children:"4Aiur"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-155-march-13-2025",children:"Version 1.5.5, March 13, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"https://github.com/VictorErmakov",children:"@VictorErmakov"})," updated the docker-compose sample with connection pool parameters to avoid fast connect cycling (#191)."]}),"\n",(0,r.jsx)(n.li,{children:"Update default values for connection pool parameters to use go-sql pooling by default to avoid fast connet cycling."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/VictorErmakov",children:"@VictorErmakov"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-154-march-3-2025",children:"Version 1.5.4, March 3, 2025"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Based of this recommendation from ",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror?tab=readme-ov-file#pooling",children:"godror"}),", which relates to the two following items, and in discussion with the ODPI-C team, we have introduced additional parameters to allow you to set connection pool parameters, and have set defaults which will avoid fast connect cycling. It is our expectation that a fix may be produced in the underlying ODPI-C library for the underlying issue. In the mean time, these changes will avoid the conditions under which the error can occur."]}),"\n",(0,r.jsx)(n.li,{children:"Fix malloc error (#177, #181)."}),"\n",(0,r.jsx)(n.li,{children:"Fix intermittent connection issues with ADB-S when exporter is run in a container (#169)."}),"\n",(0,r.jsx)(n.li,{children:"Fix Multiple custom metrics files overwrite one another (#179)."}),"\n",(0,r.jsx)(n.li,{children:"Replace go-kit/log with log/slog, due to upstream changes in prometheus/common."}),"\n",(0,r.jsxs)(n.li,{children:["Add support for additional admin roles, expanding list of options for ",(0,r.jsx)(n.code,{children:"DB_ROLE"})," to ",(0,r.jsx)(n.code,{children:"SYSDBA"}),", ",(0,r.jsx)(n.code,{children:"SYSOPER"}),", ",(0,r.jsx)(n.code,{children:"SYSBACKUP"}),", ",(0,r.jsx)(n.code,{children:"SYSDG"}),", ",(0,r.jsx)(n.code,{children:"SYSKM"}),", ",(0,r.jsx)(n.code,{children:"SYSRAC"})," and ",(0,r.jsx)(n.code,{children:"SYSASM"})," (#180)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Jman1993",children:"@Jman1993"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/oey",children:"@oey"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/jlembeck06",children:"@jlembeck06"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Jman1993",children:"@Jman1993"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/PeterP55P",children:"@PeterP55P"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/rlagyu0",children:"@rlagyu0"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/Sycri",children:"@Sycri"})}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Thank you to ",(0,r.jsx)(n.a,{href:"https://github.com/tgulacsi",children:"@tgulacsi"})," for changes in godror (",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror/issues/361",children:"https://github.com/godror/godror/issues/361"}),", ",(0,r.jsx)(n.a,{href:"https://github.com/godror/godror/issues/360",children:"https://github.com/godror/godror/issues/360"}),"), and to ",(0,r.jsx)(n.a,{href:"https://github.com/cjbj",children:"@cjbj"})," and ",(0,r.jsx)(n.a,{href:"https://github.com/sudarshan12s",children:"@sudarshan12s"})," for support and guidance from ODPI-C (",(0,r.jsx)(n.a,{href:"https://github.com/oracle/odpi",children:"https://github.com/oracle/odpi"}),")."]}),"\n",(0,r.jsx)(n.p,{children:"In this release, we also continued some minor code refactoring."}),"\n",(0,r.jsx)(n.h3,{id:"version-153-january-28-2025",children:"Version 1.5.3, January 28, 2025"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:"Known issue"}),": This release has a known issue that results in the error message ",(0,r.jsx)(n.code,{children:"malloc(): unsorted double linked list corrupted"}),".\nWe recommend staying on 1.5.2 until a new release with a fix is available. We hope to have a fix by early March."]}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Fix over-zealous supression of errors when ",(0,r.jsx)(n.code,{children:"ignorezeroresult = true"})," (#168)."]}),"\n",(0,r.jsxs)(n.li,{children:["When ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," is set, do first scrape immediately, not after the interval (#166)."]}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/redelang",children:"@redelang"})}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"In this release, we also started some minor code refactoring."}),"\n",(0,r.jsx)(n.h3,{id:"version-152-december-2-2024",children:"Version 1.5.2, December 2, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Update the metric defintion for tablespace usage to report more accurate temp space usage."}),"\n",(0,r.jsx)(n.li,{children:"Revert InstantClient to 21c version due to ADB connectivity issue."}),"\n",(0,r.jsx)(n.li,{children:"Update documentation to explain how to obtain credentials from a wallet."}),"\n",(0,r.jsx)(n.li,{children:"Fix race condition on err variable in scrape() func (by @valrusu)."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/aureliocirella",children:"@aureliocirella"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/mitoeth",children:"@mitoeth"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/valrusu",children:"@valrusu"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-151-october-28-2024",children:"Version 1.5.1, October 28, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Added support for using the ",(0,r.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable, which fixes an issue when connecting to Autonomous Database instances using TNS name."]}),"\n",(0,r.jsx)(n.li,{children:"Updated InstantClient to 23ai version for amd64 and latest available 19.24 version for arm64."}),"\n",(0,r.jsxs)(n.li,{children:["Fixed an issue with wrong ",(0,r.jsx)(n.code,{children:"LD_LIBRARY_PATH"})," on some platforms. (#136)"]}),"\n",(0,r.jsxs)(n.li,{children:["Added documentation and an example of using the ",(0,r.jsx)(n.code,{children:"scrapeinterval"})," setting to change the interval at which a certain metric is colected."]}),"\n",(0,r.jsx)(n.li,{children:"Added notes to documentation for extra security parameters needed when using a wallet with Podman."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-150-september-26-2024",children:"Version 1.5.0, September 26, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Support for running the exporter on ARM processors (darwin and linux)."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n",(0,r.jsx)(n.li,{children:'Updated the "test/demo environment" to use newer version of Oracle Database (23.5.0.24.07) and faster startup.'}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-140-september-4-2024",children:"Version 1.4.0, September 4, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Allow multiple custom metrics definition files."}),"\n",(0,r.jsx)(n.li,{children:"Allow query timeout per-metric."}),"\n",(0,r.jsx)(n.li,{children:"Allow scrape interval per-metric."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-131-july-22-2024",children:"Version 1.3.1, July 22, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Alert logs can be disabled by setting parameter ",(0,r.jsx)(n.code,{children:"log.disable"})," to ",(0,r.jsx)(n.code,{children:"1"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"Alert log exporter will stop if it gets three consecutive failures."}),"\n",(0,r.jsx)(n.li,{children:"Updated the list of required permissions."}),"\n",(0,r.jsx)(n.li,{children:"Updated the TxEventQ sample dashboard."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/tux-jochen",children:"@tux-jochen"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-130-june-7-2024",children:"Version 1.3.0, June 7, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Alert logs can be exported for collection by a log reader like Promtail or FluentBit. Default\noutput to ",(0,r.jsx)(n.code,{children:"/log/alert.log"})," in JSON format."]}),"\n",(0,r.jsx)(n.li,{children:"Provide ability to connect as SYSDBA or SYSOPER by setting DB_ROLE."}),"\n",(0,r.jsx)(n.li,{children:"New default metric is added to report the type of database connected to (CDB or PDB)."}),"\n",(0,r.jsx)(n.li,{children:"New default metrics are added for cache hit ratios."}),"\n",(0,r.jsx)(n.li,{children:"Default metrics updated to suppress spurious warnings in log."}),"\n",(0,r.jsx)(n.li,{children:"Wait class metric updated to use a better query."}),"\n",(0,r.jsx)(n.li,{children:"The sample dashboard is updated to include new metrics."}),"\n",(0,r.jsx)(n.li,{children:"Fixed a bug which prevented periodic freeing of memory."}),"\n",(0,r.jsx)(n.li,{children:"Set CLIENT_INFO to a meaningful value."}),"\n",(0,r.jsx)(n.li,{children:"Update Go toolchain to 1.22.4."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Thank you to the following people for their suggestions and contributions:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/pioro",children:"@pioro"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"https://github.com/savoir81",children:"@savoir81"})}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-121-april-16-2024",children:"Version 1.2.1, April 16, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Accept max idle and open connections settings as parameters."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-120-january-17-2024",children:"Version 1.2.0, January 17, 2024"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Introduced a new feature to periodically restart the process if requested."}),"\n",(0,r.jsx)(n.li,{children:"Introduced a new feature to periodically attempt to free OS memory if requested."}),"\n",(0,r.jsx)(n.li,{children:"Updated some third-party dependencies."}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-111-november-28-2023",children:"Version 1.1.1, November 28, 2023"}),"\n",(0,r.jsx)(n.p,{children:"This release just updates some third-party dependencies."}),"\n",(0,r.jsx)(n.h3,{id:"version-11-october-27-2023",children:"Version 1.1, October 27, 2023"}),"\n",(0,r.jsx)(n.p,{children:"This release includes the following changes:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The query for the standard metric ",(0,r.jsx)(n.code,{children:"wait_class"})," has been updated so that it will work in both container databases\nand pluggable databases, including in Oracle Autonomous Database instances. Note that this query will not return\nany data unless the database instance is under load."]}),"\n",(0,r.jsxs)(n.li,{children:["Support for reading the database password from OCI Vault has been added (see ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/oci-vault",children:"details"}),")"]}),"\n",(0,r.jsx)(n.li,{children:"Log messages have been improved"}),"\n",(0,r.jsx)(n.li,{children:"Some dependencies have been updated"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"version-10-september-13-2023",children:"Version 1.0, September 13, 2023"}),"\n",(0,r.jsx)(n.p,{children:"The first production release, v1.0, includes the following features:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A number of ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/getting-started/default-metrics",children:"standard metrics"})," are exposed,"]}),"\n",(0,r.jsxs)(n.li,{children:["Users can define ",(0,r.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/custom-metrics",children:"custom metrics"}),","]}),"\n",(0,r.jsx)(n.li,{children:"Oracle regularly reviews third-party licenses and scans the code and images, including transitive/recursive dependencies for issues,"}),"\n",(0,r.jsx)(n.li,{children:"Connection to Oracle can be a basic connection or use an Oracle Wallet and TLS - connection to Oracle Autonomous Database is supported,"}),"\n",(0,r.jsx)(n.li,{children:"Metrics for Oracle Transactional Event Queues are also supported,"}),"\n",(0,r.jsx)(n.li,{children:"A Grafana dashboard is provided for Transactional Event Queues, and"}),"\n",(0,r.jsx)(n.li,{children:"A pre-built container image is provided, based on Oracle Linux, and optimized for size and security."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Note that this exporter uses a different Oracle Database driver which in turn uses code directly written by Oracle to access the database. This driver does require an Oracle client. In this initial release, the client is bundled into the container image, however we intend to make that optional in order to minimize the image size."}),"\n",(0,r.jsx)(n.p,{children:"The interfaces for this version have been kept as close as possible to those of earlier alpha releases in this repository to assist with migration. However, it should be expected that there may be breaking changes in future releases."})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>o});var s=i(6540);const r={},t=s.createContext(r);function l(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/c539c6ff.de828870.js b/docs/assets/js/c539c6ff.de828870.js new file mode 100644 index 00000000..669c38bf --- /dev/null +++ b/docs/assets/js/c539c6ff.de828870.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4468],{8321:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>d,contentTitle:()=>_,default:()=>i,frontMatter:()=>o,metadata:()=>s,toc:()=>n});const s=JSON.parse('{"id":"getting-started/default-metrics","title":"Default Metrics","description":"The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.","source":"@site/versioned_docs/version-2.2.0/getting-started/default-metrics.md","sourceDirName":"getting-started","slug":"/getting-started/default-metrics","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/default-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/getting-started/default-metrics.md","tags":[],"version":"2.2.0","sidebarPosition":2,"frontMatter":{"title":"Default Metrics","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Installation","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/basics"},"next":{"title":"Kubernetes","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/kubernetes"}}');var r=t(4848),c=t(8453);const o={title:"Default Metrics",sidebar_position:2},_="Default Metrics",d={},n=[];function l(e){const a={a:"a",code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,c.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.header,{children:(0,r.jsx)(a.h1,{id:"default-metrics",children:"Default Metrics"})}),"\n",(0,r.jsxs)(a.p,{children:["The exporter includes ",(0,r.jsx)(a.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/collector/default_metrics.toml",children:"default metrics"})," for Oracle Database, and process-specific metrics on the ",(0,r.jsx)(a.code,{children:"go"})," runtime."]}),"\n",(0,r.jsxs)(a.p,{children:["You can find the exporter's metric schema in the ",(0,r.jsx)(a.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics#metric-schema",children:"Custom Metrics configuration"}),"."]}),"\n",(0,r.jsx)(a.p,{children:'The following metrics are included by default. The values given are a sample for a single database, "db1":'}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-bash",children:'# HELP oracledb_activity_execute_count Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_execute_count gauge\noracledb_activity_execute_count{database="db1"} 6.212049e+06\n# HELP oracledb_activity_parse_count_total Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_parse_count_total gauge\noracledb_activity_parse_count_total{database="db1"} 1.054178e+06\n# HELP oracledb_activity_user_commits Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_user_commits gauge\noracledb_activity_user_commits{database="db1"} 86538\n# HELP oracledb_activity_user_rollbacks Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_user_rollbacks gauge\noracledb_activity_user_rollbacks{database="db1"} 18\n# HELP oracledb_db_platform_value Database platform\n# TYPE oracledb_db_platform_value gauge\noracledb_db_platform_value{database="db1",platform_name="Linux OS (AARCH64)"} 1\n# HELP oracledb_db_system_value Database system resources metric\n# TYPE oracledb_db_system_value gauge\noracledb_db_system_value{database="db1",name="cpu_count"} 2\noracledb_db_system_value{database="db1",name="pga_aggregate_limit"} 2.147483648e+09\noracledb_db_system_value{database="db1",name="sga_max_size"} 1.610612736e+09\n# HELP oracledb_dbtype Type of database the exporter is connected to (0=non-CDB, 1=CDB, >1=PDB).\n# TYPE oracledb_dbtype gauge\noracledb_dbtype{database="db1"} 3\n# HELP oracledb_exporter_build_info A metric with a constant \'1\' value labeled by version, revision, branch, goversion from which oracledb_exporter was built, and the goos and goarch for the build.\n# TYPE oracledb_exporter_build_info gauge\noracledb_exporter_build_info{branch="",goarch="arm64",goos="darwin",goversion="go1.24.5",revision="unknown",tags="unknown",version=""} 1\n# HELP oracledb_exporter_last_scrape_duration_seconds Duration of the last scrape of metrics from Oracle DB.\n# TYPE oracledb_exporter_last_scrape_duration_seconds gauge\noracledb_exporter_last_scrape_duration_seconds 0.05714725\n# HELP oracledb_exporter_last_scrape_error Whether the last scrape of metrics from Oracle DB resulted in an error (1 for error, 0 for success).\n# TYPE oracledb_exporter_last_scrape_error gauge\noracledb_exporter_last_scrape_error 0\n# HELP oracledb_exporter_scrapes_total Total number of times Oracle DB was scraped for metrics.\n# TYPE oracledb_exporter_scrapes_total counter\noracledb_exporter_scrapes_total 2\n# HELP oracledb_process_count Gauge metric with count of processes.\n# TYPE oracledb_process_count gauge\noracledb_process_count{database="db1"} 85\n# HELP oracledb_sessions_value Gauge metric with count of sessions by status and type.\n# TYPE oracledb_sessions_value gauge\noracledb_sessions_value{database="db1",status="ACTIVE",type="BACKGROUND"} 61\noracledb_sessions_value{database="db1",status="ACTIVE",type="USER"} 2\noracledb_sessions_value{database="db1",status="INACTIVE",type="USER"} 19\n# HELP oracledb_tablespace_bytes Generic counter metric of tablespaces bytes in Oracle.\n# TYPE oracledb_tablespace_bytes gauge\noracledb_tablespace_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.7430784e+08\noracledb_tablespace_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 3.18963712e+08\noracledb_tablespace_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 7.340032e+06\noracledb_tablespace_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 2.1364736e+07\noracledb_tablespace_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 7.340032e+06\n# HELP oracledb_tablespace_free Generic counter metric of tablespaces free bytes in Oracle.\n# TYPE oracledb_tablespace_free gauge\noracledb_tablespace_free{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.5289739264e+10\noracledb_tablespace_free{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.524491264e+10\noracledb_tablespace_free{database="db1",tablespace="TEMP",type="TEMPORARY"} 1.3631488e+07\noracledb_tablespace_free{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.518435069952e+13\noracledb_tablespace_free{database="db1",tablespace="USERS",type="PERMANENT"} 3.4352381952e+10\n# HELP oracledb_tablespace_max_bytes Generic counter metric of tablespaces max bytes in Oracle.\n# TYPE oracledb_tablespace_max_bytes gauge\noracledb_tablespace_max_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.6064047104e+10\noracledb_tablespace_max_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.5563876352e+10\noracledb_tablespace_max_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 2.097152e+07\noracledb_tablespace_max_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.5184372064256e+13\noracledb_tablespace_max_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 3.4359721984e+10\n# HELP oracledb_tablespace_used_percent Gauge metric showing as a percentage of how much of the tablespace has been used.\n# TYPE oracledb_tablespace_used_percent gauge\noracledb_tablespace_used_percent{database="db1",tablespace="SYSAUX",type="PERMANENT"} 1.0179682379262742\noracledb_tablespace_used_percent{database="db1",tablespace="SYSTEM",type="PERMANENT"} 0.4221113677574824\noracledb_tablespace_used_percent{database="db1",tablespace="TEMP",type="TEMPORARY"} 0.35\noracledb_tablespace_used_percent{database="db1",tablespace="UNDOTBS1",type="UNDO"} 6.072223190734319e-05\noracledb_tablespace_used_percent{database="db1",tablespace="USERS",type="PERMANENT"} 0.021362314873845517\n# HELP oracledb_top_sql_elapsed SQL statement elapsed time running\n# TYPE oracledb_top_sql_elapsed gauge\noracledb_top_sql_elapsed{database="db1",sql_id="0npm6czzaj44m",sql_text="SELECT idx_objn FROM vecsys.vector$index WHERE JSON_VAL"} 6.118614\noracledb_top_sql_elapsed{database="db1",sql_id="0sbbcuruzd66f",sql_text="select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null"} 1.538687\noracledb_top_sql_elapsed{database="db1",sql_id="121ffmrc95v7g",sql_text="select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,"} 2.200984\noracledb_top_sql_elapsed{database="db1",sql_id="61znfd8fvgha6",sql_text="SELECT new.sql_seq, old.plan_hash_value, sqlset_row(ne"} 2.628263\noracledb_top_sql_elapsed{database="db1",sql_id="68dw2nt8wtunk",sql_text="select originating_timestamp, module_id, execution_cont"} 2.296924\noracledb_top_sql_elapsed{database="db1",sql_id="9bd61v53p81sk",sql_text="begin prvt_hdm.auto_execute( :dbid , :inst_num , :end_s"} 1.67611\noracledb_top_sql_elapsed{database="db1",sql_id="aba13jkkk3fts",sql_text="SELECT idx_objn, json_value(IDX_SPARE2, \'$.counter\') FR"} 3.010397\noracledb_top_sql_elapsed{database="db1",sql_id="afcz0dh295hzp",sql_text=" SELECT /*+ first_rows(1) */ sql_id, force_matching_sig"} 2.246092\noracledb_top_sql_elapsed{database="db1",sql_id="ampw9ddqufjd3",sql_text="begin /*KAPI:capture*/ dbms_auto_index_internal.capture"} 4.102646\noracledb_top_sql_elapsed{database="db1",sql_id="avzy19hxu6gg4",sql_text="SELECT VALUE(P) FROM TABLE(DBMS_SQLTUNE.SELECT_CURSOR_C"} 2.564301\noracledb_top_sql_elapsed{database="db1",sql_id="b39m8n96gxk7c",sql_text="call dbms_autotask_prvt.run_autotask ( :0,:1 )"} 4.418653\noracledb_top_sql_elapsed{database="db1",sql_id="bj9ajtpfh9f41",sql_text=" declare purge_scn "} 6.425015\noracledb_top_sql_elapsed{database="db1",sql_id="bq819r502v7u2",sql_text="select originating_timestamp, module_id, execution_cont"} 3.676572\noracledb_top_sql_elapsed{database="db1",sql_id="ddrfu7d7hbkym",sql_text=" select count(1), partition_id "} 1.870379\noracledb_top_sql_elapsed{database="db1",sql_id="f6w8rqdkx0bnv",sql_text="SELECT * FROM ( SELECT /*+ ordered use_nl(o c cu h) ind"} 1.895947\n# HELP oracledb_up Whether the Oracle database server is up.\n# TYPE oracledb_up gauge\noracledb_up{database="db1"} 1\n# HELP oracledb_wait_time_administrative counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_administrative counter\noracledb_wait_time_administrative{database="db1"} 0\n# HELP oracledb_wait_time_application counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_application counter\noracledb_wait_time_application{database="db1"} 0.73\n# HELP oracledb_wait_time_commit counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_commit counter\noracledb_wait_time_commit{database="db1"} 0.17\n# HELP oracledb_wait_time_concurrency counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_concurrency counter\noracledb_wait_time_concurrency{database="db1"} 6.8\n# HELP oracledb_wait_time_configuration counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_configuration counter\noracledb_wait_time_configuration{database="db1"} 19.71\n# HELP oracledb_wait_time_network counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_network counter\noracledb_wait_time_network{database="db1"} 0.29\n# HELP oracledb_wait_time_other counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_other counter\noracledb_wait_time_other{database="db1"} 6.02\n# HELP oracledb_wait_time_scheduler counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_scheduler counter\noracledb_wait_time_scheduler{database="db1"} 4.01\n# HELP oracledb_wait_time_system_io counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_system_io counter\noracledb_wait_time_system_io{database="db1"} 0.13\n# HELP oracledb_wait_time_user_io counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_user_io counter\noracledb_wait_time_user_io{database="db1"} 12.38\n'})})]})}function i(e={}){const{wrapper:a}={...(0,c.R)(),...e.components};return a?(0,r.jsx)(a,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,a,t)=>{t.d(a,{R:()=>o,x:()=>_});var s=t(6540);const r={},c=s.createContext(r);function o(e){const a=s.useContext(c);return s.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function _(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(c.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/cafd52b9.54a46ab1.js b/docs/assets/js/cafd52b9.54a46ab1.js new file mode 100644 index 00000000..9d27301a --- /dev/null +++ b/docs/assets/js/cafd52b9.54a46ab1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[879],{2098:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>d,contentTitle:()=>_,default:()=>i,frontMatter:()=>o,metadata:()=>s,toc:()=>n});const s=JSON.parse('{"id":"getting-started/default-metrics","title":"Default Metrics","description":"The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.","source":"@site/versioned_docs/version-2.1.0/getting-started/default-metrics.md","sourceDirName":"getting-started","slug":"/getting-started/default-metrics","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/default-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/getting-started/default-metrics.md","tags":[],"version":"2.1.0","sidebarPosition":2,"frontMatter":{"title":"Default Metrics","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Installation","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/basics"},"next":{"title":"Kubernetes","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/kubernetes"}}');var r=t(4848),c=t(8453);const o={title:"Default Metrics",sidebar_position:2},_="Default Metrics",d={},n=[];function l(e){const a={a:"a",code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,c.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.header,{children:(0,r.jsx)(a.h1,{id:"default-metrics",children:"Default Metrics"})}),"\n",(0,r.jsxs)(a.p,{children:["The exporter includes ",(0,r.jsx)(a.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/collector/default_metrics.toml",children:"default metrics"})," for Oracle Database, and process-specific metrics on the ",(0,r.jsx)(a.code,{children:"go"})," runtime."]}),"\n",(0,r.jsxs)(a.p,{children:["You can find the exporter's metric schema in the ",(0,r.jsx)(a.a,{href:"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/custom-metrics#metric-schema",children:"Custom Metrics configuration"}),"."]}),"\n",(0,r.jsx)(a.p,{children:'The following metrics are included by default. The values given are a sample for a single database, "db1":'}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-bash",children:'# HELP oracledb_activity_execute_count Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_execute_count gauge\noracledb_activity_execute_count{database="db1"} 6.212049e+06\n# HELP oracledb_activity_parse_count_total Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_parse_count_total gauge\noracledb_activity_parse_count_total{database="db1"} 1.054178e+06\n# HELP oracledb_activity_user_commits Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_user_commits gauge\noracledb_activity_user_commits{database="db1"} 86538\n# HELP oracledb_activity_user_rollbacks Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_user_rollbacks gauge\noracledb_activity_user_rollbacks{database="db1"} 18\n# HELP oracledb_db_platform_value Database platform\n# TYPE oracledb_db_platform_value gauge\noracledb_db_platform_value{database="db1",platform_name="Linux OS (AARCH64)"} 1\n# HELP oracledb_db_system_value Database system resources metric\n# TYPE oracledb_db_system_value gauge\noracledb_db_system_value{database="db1",name="cpu_count"} 2\noracledb_db_system_value{database="db1",name="pga_aggregate_limit"} 2.147483648e+09\noracledb_db_system_value{database="db1",name="sga_max_size"} 1.610612736e+09\n# HELP oracledb_dbtype Type of database the exporter is connected to (0=non-CDB, 1=CDB, >1=PDB).\n# TYPE oracledb_dbtype gauge\noracledb_dbtype{database="db1"} 3\n# HELP oracledb_exporter_build_info A metric with a constant \'1\' value labeled by version, revision, branch, goversion from which oracledb_exporter was built, and the goos and goarch for the build.\n# TYPE oracledb_exporter_build_info gauge\noracledb_exporter_build_info{branch="",goarch="arm64",goos="darwin",goversion="go1.24.5",revision="unknown",tags="unknown",version=""} 1\n# HELP oracledb_exporter_last_scrape_duration_seconds Duration of the last scrape of metrics from Oracle DB.\n# TYPE oracledb_exporter_last_scrape_duration_seconds gauge\noracledb_exporter_last_scrape_duration_seconds 0.05714725\n# HELP oracledb_exporter_last_scrape_error Whether the last scrape of metrics from Oracle DB resulted in an error (1 for error, 0 for success).\n# TYPE oracledb_exporter_last_scrape_error gauge\noracledb_exporter_last_scrape_error 0\n# HELP oracledb_exporter_scrapes_total Total number of times Oracle DB was scraped for metrics.\n# TYPE oracledb_exporter_scrapes_total counter\noracledb_exporter_scrapes_total 2\n# HELP oracledb_process_count Gauge metric with count of processes.\n# TYPE oracledb_process_count gauge\noracledb_process_count{database="db1"} 85\n# HELP oracledb_sessions_value Gauge metric with count of sessions by status and type.\n# TYPE oracledb_sessions_value gauge\noracledb_sessions_value{database="db1",status="ACTIVE",type="BACKGROUND"} 61\noracledb_sessions_value{database="db1",status="ACTIVE",type="USER"} 2\noracledb_sessions_value{database="db1",status="INACTIVE",type="USER"} 19\n# HELP oracledb_tablespace_bytes Generic counter metric of tablespaces bytes in Oracle.\n# TYPE oracledb_tablespace_bytes gauge\noracledb_tablespace_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.7430784e+08\noracledb_tablespace_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 3.18963712e+08\noracledb_tablespace_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 7.340032e+06\noracledb_tablespace_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 2.1364736e+07\noracledb_tablespace_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 7.340032e+06\n# HELP oracledb_tablespace_free Generic counter metric of tablespaces free bytes in Oracle.\n# TYPE oracledb_tablespace_free gauge\noracledb_tablespace_free{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.5289739264e+10\noracledb_tablespace_free{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.524491264e+10\noracledb_tablespace_free{database="db1",tablespace="TEMP",type="TEMPORARY"} 1.3631488e+07\noracledb_tablespace_free{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.518435069952e+13\noracledb_tablespace_free{database="db1",tablespace="USERS",type="PERMANENT"} 3.4352381952e+10\n# HELP oracledb_tablespace_max_bytes Generic counter metric of tablespaces max bytes in Oracle.\n# TYPE oracledb_tablespace_max_bytes gauge\noracledb_tablespace_max_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.6064047104e+10\noracledb_tablespace_max_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.5563876352e+10\noracledb_tablespace_max_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 2.097152e+07\noracledb_tablespace_max_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.5184372064256e+13\noracledb_tablespace_max_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 3.4359721984e+10\n# HELP oracledb_tablespace_used_percent Gauge metric showing as a percentage of how much of the tablespace has been used.\n# TYPE oracledb_tablespace_used_percent gauge\noracledb_tablespace_used_percent{database="db1",tablespace="SYSAUX",type="PERMANENT"} 1.0179682379262742\noracledb_tablespace_used_percent{database="db1",tablespace="SYSTEM",type="PERMANENT"} 0.4221113677574824\noracledb_tablespace_used_percent{database="db1",tablespace="TEMP",type="TEMPORARY"} 0.35\noracledb_tablespace_used_percent{database="db1",tablespace="UNDOTBS1",type="UNDO"} 6.072223190734319e-05\noracledb_tablespace_used_percent{database="db1",tablespace="USERS",type="PERMANENT"} 0.021362314873845517\n# HELP oracledb_top_sql_elapsed SQL statement elapsed time running\n# TYPE oracledb_top_sql_elapsed gauge\noracledb_top_sql_elapsed{database="db1",sql_id="0npm6czzaj44m",sql_text="SELECT idx_objn FROM vecsys.vector$index WHERE JSON_VAL"} 6.118614\noracledb_top_sql_elapsed{database="db1",sql_id="0sbbcuruzd66f",sql_text="select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null"} 1.538687\noracledb_top_sql_elapsed{database="db1",sql_id="121ffmrc95v7g",sql_text="select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,"} 2.200984\noracledb_top_sql_elapsed{database="db1",sql_id="61znfd8fvgha6",sql_text="SELECT new.sql_seq, old.plan_hash_value, sqlset_row(ne"} 2.628263\noracledb_top_sql_elapsed{database="db1",sql_id="68dw2nt8wtunk",sql_text="select originating_timestamp, module_id, execution_cont"} 2.296924\noracledb_top_sql_elapsed{database="db1",sql_id="9bd61v53p81sk",sql_text="begin prvt_hdm.auto_execute( :dbid , :inst_num , :end_s"} 1.67611\noracledb_top_sql_elapsed{database="db1",sql_id="aba13jkkk3fts",sql_text="SELECT idx_objn, json_value(IDX_SPARE2, \'$.counter\') FR"} 3.010397\noracledb_top_sql_elapsed{database="db1",sql_id="afcz0dh295hzp",sql_text=" SELECT /*+ first_rows(1) */ sql_id, force_matching_sig"} 2.246092\noracledb_top_sql_elapsed{database="db1",sql_id="ampw9ddqufjd3",sql_text="begin /*KAPI:capture*/ dbms_auto_index_internal.capture"} 4.102646\noracledb_top_sql_elapsed{database="db1",sql_id="avzy19hxu6gg4",sql_text="SELECT VALUE(P) FROM TABLE(DBMS_SQLTUNE.SELECT_CURSOR_C"} 2.564301\noracledb_top_sql_elapsed{database="db1",sql_id="b39m8n96gxk7c",sql_text="call dbms_autotask_prvt.run_autotask ( :0,:1 )"} 4.418653\noracledb_top_sql_elapsed{database="db1",sql_id="bj9ajtpfh9f41",sql_text=" declare purge_scn "} 6.425015\noracledb_top_sql_elapsed{database="db1",sql_id="bq819r502v7u2",sql_text="select originating_timestamp, module_id, execution_cont"} 3.676572\noracledb_top_sql_elapsed{database="db1",sql_id="ddrfu7d7hbkym",sql_text=" select count(1), partition_id "} 1.870379\noracledb_top_sql_elapsed{database="db1",sql_id="f6w8rqdkx0bnv",sql_text="SELECT * FROM ( SELECT /*+ ordered use_nl(o c cu h) ind"} 1.895947\n# HELP oracledb_up Whether the Oracle database server is up.\n# TYPE oracledb_up gauge\noracledb_up{database="db1"} 1\n# HELP oracledb_wait_time_administrative counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_administrative counter\noracledb_wait_time_administrative{database="db1"} 0\n# HELP oracledb_wait_time_application counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_application counter\noracledb_wait_time_application{database="db1"} 0.73\n# HELP oracledb_wait_time_commit counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_commit counter\noracledb_wait_time_commit{database="db1"} 0.17\n# HELP oracledb_wait_time_concurrency counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_concurrency counter\noracledb_wait_time_concurrency{database="db1"} 6.8\n# HELP oracledb_wait_time_configuration counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_configuration counter\noracledb_wait_time_configuration{database="db1"} 19.71\n# HELP oracledb_wait_time_network counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_network counter\noracledb_wait_time_network{database="db1"} 0.29\n# HELP oracledb_wait_time_other counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_other counter\noracledb_wait_time_other{database="db1"} 6.02\n# HELP oracledb_wait_time_scheduler counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_scheduler counter\noracledb_wait_time_scheduler{database="db1"} 4.01\n# HELP oracledb_wait_time_system_io counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_system_io counter\noracledb_wait_time_system_io{database="db1"} 0.13\n# HELP oracledb_wait_time_user_io counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_user_io counter\noracledb_wait_time_user_io{database="db1"} 12.38\n'})})]})}function i(e={}){const{wrapper:a}={...(0,c.R)(),...e.components};return a?(0,r.jsx)(a,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,a,t)=>{t.d(a,{R:()=>o,x:()=>_});var s=t(6540);const r={},c=s.createContext(r);function o(e){const a=s.useContext(c);return s.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function _(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(c.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/cafd52b9.92fd6081.js b/docs/assets/js/cafd52b9.92fd6081.js deleted file mode 100644 index bcfecba7..00000000 --- a/docs/assets/js/cafd52b9.92fd6081.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[879],{2098:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>d,contentTitle:()=>_,default:()=>i,frontMatter:()=>o,metadata:()=>s,toc:()=>n});const s=JSON.parse('{"id":"getting-started/default-metrics","title":"Default Metrics","description":"The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.","source":"@site/versioned_docs/version-2.1.0/getting-started/default-metrics.md","sourceDirName":"getting-started","slug":"/getting-started/default-metrics","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/default-metrics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/getting-started/default-metrics.md","tags":[],"version":"2.1.0","sidebarPosition":2,"frontMatter":{"title":"Default Metrics","sidebar_position":2},"sidebar":"tutorialSidebar","previous":{"title":"Installation","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/basics"},"next":{"title":"Kubernetes","permalink":"/oracle-db-appdev-monitoring/docs/getting-started/kubernetes"}}');var r=t(4848),c=t(8453);const o={title:"Default Metrics",sidebar_position:2},_="Default Metrics",d={},n=[];function l(e){const a={a:"a",code:"code",h1:"h1",header:"header",p:"p",pre:"pre",...(0,c.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a.header,{children:(0,r.jsx)(a.h1,{id:"default-metrics",children:"Default Metrics"})}),"\n",(0,r.jsxs)(a.p,{children:["The exporter includes ",(0,r.jsx)(a.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/collector/default_metrics.toml",children:"default metrics"})," for Oracle Database, and process-specific metrics on the ",(0,r.jsx)(a.code,{children:"go"})," runtime."]}),"\n",(0,r.jsxs)(a.p,{children:["You can find the exporter's metric schema in the ",(0,r.jsx)(a.a,{href:"/oracle-db-appdev-monitoring/docs/configuration/custom-metrics#metric-schema",children:"Custom Metrics configuration"}),"."]}),"\n",(0,r.jsx)(a.p,{children:'The following metrics are included by default. The values given are a sample for a single database, "db1":'}),"\n",(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-bash",children:'# HELP oracledb_activity_execute_count Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_execute_count gauge\noracledb_activity_execute_count{database="db1"} 6.212049e+06\n# HELP oracledb_activity_parse_count_total Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_parse_count_total gauge\noracledb_activity_parse_count_total{database="db1"} 1.054178e+06\n# HELP oracledb_activity_user_commits Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_user_commits gauge\noracledb_activity_user_commits{database="db1"} 86538\n# HELP oracledb_activity_user_rollbacks Generic counter metric from gv$sysstat view in Oracle.\n# TYPE oracledb_activity_user_rollbacks gauge\noracledb_activity_user_rollbacks{database="db1"} 18\n# HELP oracledb_db_platform_value Database platform\n# TYPE oracledb_db_platform_value gauge\noracledb_db_platform_value{database="db1",platform_name="Linux OS (AARCH64)"} 1\n# HELP oracledb_db_system_value Database system resources metric\n# TYPE oracledb_db_system_value gauge\noracledb_db_system_value{database="db1",name="cpu_count"} 2\noracledb_db_system_value{database="db1",name="pga_aggregate_limit"} 2.147483648e+09\noracledb_db_system_value{database="db1",name="sga_max_size"} 1.610612736e+09\n# HELP oracledb_dbtype Type of database the exporter is connected to (0=non-CDB, 1=CDB, >1=PDB).\n# TYPE oracledb_dbtype gauge\noracledb_dbtype{database="db1"} 3\n# HELP oracledb_exporter_build_info A metric with a constant \'1\' value labeled by version, revision, branch, goversion from which oracledb_exporter was built, and the goos and goarch for the build.\n# TYPE oracledb_exporter_build_info gauge\noracledb_exporter_build_info{branch="",goarch="arm64",goos="darwin",goversion="go1.24.5",revision="unknown",tags="unknown",version=""} 1\n# HELP oracledb_exporter_last_scrape_duration_seconds Duration of the last scrape of metrics from Oracle DB.\n# TYPE oracledb_exporter_last_scrape_duration_seconds gauge\noracledb_exporter_last_scrape_duration_seconds 0.05714725\n# HELP oracledb_exporter_last_scrape_error Whether the last scrape of metrics from Oracle DB resulted in an error (1 for error, 0 for success).\n# TYPE oracledb_exporter_last_scrape_error gauge\noracledb_exporter_last_scrape_error 0\n# HELP oracledb_exporter_scrapes_total Total number of times Oracle DB was scraped for metrics.\n# TYPE oracledb_exporter_scrapes_total counter\noracledb_exporter_scrapes_total 2\n# HELP oracledb_process_count Gauge metric with count of processes.\n# TYPE oracledb_process_count gauge\noracledb_process_count{database="db1"} 85\n# HELP oracledb_sessions_value Gauge metric with count of sessions by status and type.\n# TYPE oracledb_sessions_value gauge\noracledb_sessions_value{database="db1",status="ACTIVE",type="BACKGROUND"} 61\noracledb_sessions_value{database="db1",status="ACTIVE",type="USER"} 2\noracledb_sessions_value{database="db1",status="INACTIVE",type="USER"} 19\n# HELP oracledb_tablespace_bytes Generic counter metric of tablespaces bytes in Oracle.\n# TYPE oracledb_tablespace_bytes gauge\noracledb_tablespace_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.7430784e+08\noracledb_tablespace_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 3.18963712e+08\noracledb_tablespace_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 7.340032e+06\noracledb_tablespace_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 2.1364736e+07\noracledb_tablespace_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 7.340032e+06\n# HELP oracledb_tablespace_free Generic counter metric of tablespaces free bytes in Oracle.\n# TYPE oracledb_tablespace_free gauge\noracledb_tablespace_free{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.5289739264e+10\noracledb_tablespace_free{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.524491264e+10\noracledb_tablespace_free{database="db1",tablespace="TEMP",type="TEMPORARY"} 1.3631488e+07\noracledb_tablespace_free{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.518435069952e+13\noracledb_tablespace_free{database="db1",tablespace="USERS",type="PERMANENT"} 3.4352381952e+10\n# HELP oracledb_tablespace_max_bytes Generic counter metric of tablespaces max bytes in Oracle.\n# TYPE oracledb_tablespace_max_bytes gauge\noracledb_tablespace_max_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.6064047104e+10\noracledb_tablespace_max_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.5563876352e+10\noracledb_tablespace_max_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 2.097152e+07\noracledb_tablespace_max_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.5184372064256e+13\noracledb_tablespace_max_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 3.4359721984e+10\n# HELP oracledb_tablespace_used_percent Gauge metric showing as a percentage of how much of the tablespace has been used.\n# TYPE oracledb_tablespace_used_percent gauge\noracledb_tablespace_used_percent{database="db1",tablespace="SYSAUX",type="PERMANENT"} 1.0179682379262742\noracledb_tablespace_used_percent{database="db1",tablespace="SYSTEM",type="PERMANENT"} 0.4221113677574824\noracledb_tablespace_used_percent{database="db1",tablespace="TEMP",type="TEMPORARY"} 0.35\noracledb_tablespace_used_percent{database="db1",tablespace="UNDOTBS1",type="UNDO"} 6.072223190734319e-05\noracledb_tablespace_used_percent{database="db1",tablespace="USERS",type="PERMANENT"} 0.021362314873845517\n# HELP oracledb_top_sql_elapsed SQL statement elapsed time running\n# TYPE oracledb_top_sql_elapsed gauge\noracledb_top_sql_elapsed{database="db1",sql_id="0npm6czzaj44m",sql_text="SELECT idx_objn FROM vecsys.vector$index WHERE JSON_VAL"} 6.118614\noracledb_top_sql_elapsed{database="db1",sql_id="0sbbcuruzd66f",sql_text="select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null"} 1.538687\noracledb_top_sql_elapsed{database="db1",sql_id="121ffmrc95v7g",sql_text="select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,"} 2.200984\noracledb_top_sql_elapsed{database="db1",sql_id="61znfd8fvgha6",sql_text="SELECT new.sql_seq, old.plan_hash_value, sqlset_row(ne"} 2.628263\noracledb_top_sql_elapsed{database="db1",sql_id="68dw2nt8wtunk",sql_text="select originating_timestamp, module_id, execution_cont"} 2.296924\noracledb_top_sql_elapsed{database="db1",sql_id="9bd61v53p81sk",sql_text="begin prvt_hdm.auto_execute( :dbid , :inst_num , :end_s"} 1.67611\noracledb_top_sql_elapsed{database="db1",sql_id="aba13jkkk3fts",sql_text="SELECT idx_objn, json_value(IDX_SPARE2, \'$.counter\') FR"} 3.010397\noracledb_top_sql_elapsed{database="db1",sql_id="afcz0dh295hzp",sql_text=" SELECT /*+ first_rows(1) */ sql_id, force_matching_sig"} 2.246092\noracledb_top_sql_elapsed{database="db1",sql_id="ampw9ddqufjd3",sql_text="begin /*KAPI:capture*/ dbms_auto_index_internal.capture"} 4.102646\noracledb_top_sql_elapsed{database="db1",sql_id="avzy19hxu6gg4",sql_text="SELECT VALUE(P) FROM TABLE(DBMS_SQLTUNE.SELECT_CURSOR_C"} 2.564301\noracledb_top_sql_elapsed{database="db1",sql_id="b39m8n96gxk7c",sql_text="call dbms_autotask_prvt.run_autotask ( :0,:1 )"} 4.418653\noracledb_top_sql_elapsed{database="db1",sql_id="bj9ajtpfh9f41",sql_text=" declare purge_scn "} 6.425015\noracledb_top_sql_elapsed{database="db1",sql_id="bq819r502v7u2",sql_text="select originating_timestamp, module_id, execution_cont"} 3.676572\noracledb_top_sql_elapsed{database="db1",sql_id="ddrfu7d7hbkym",sql_text=" select count(1), partition_id "} 1.870379\noracledb_top_sql_elapsed{database="db1",sql_id="f6w8rqdkx0bnv",sql_text="SELECT * FROM ( SELECT /*+ ordered use_nl(o c cu h) ind"} 1.895947\n# HELP oracledb_up Whether the Oracle database server is up.\n# TYPE oracledb_up gauge\noracledb_up{database="db1"} 1\n# HELP oracledb_wait_time_administrative counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_administrative counter\noracledb_wait_time_administrative{database="db1"} 0\n# HELP oracledb_wait_time_application counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_application counter\noracledb_wait_time_application{database="db1"} 0.73\n# HELP oracledb_wait_time_commit counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_commit counter\noracledb_wait_time_commit{database="db1"} 0.17\n# HELP oracledb_wait_time_concurrency counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_concurrency counter\noracledb_wait_time_concurrency{database="db1"} 6.8\n# HELP oracledb_wait_time_configuration counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_configuration counter\noracledb_wait_time_configuration{database="db1"} 19.71\n# HELP oracledb_wait_time_network counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_network counter\noracledb_wait_time_network{database="db1"} 0.29\n# HELP oracledb_wait_time_other counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_other counter\noracledb_wait_time_other{database="db1"} 6.02\n# HELP oracledb_wait_time_scheduler counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_scheduler counter\noracledb_wait_time_scheduler{database="db1"} 4.01\n# HELP oracledb_wait_time_system_io counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_system_io counter\noracledb_wait_time_system_io{database="db1"} 0.13\n# HELP oracledb_wait_time_user_io counter metric from system_wait_class view in Oracle.\n# TYPE oracledb_wait_time_user_io counter\noracledb_wait_time_user_io{database="db1"} 12.38\n'})})]})}function i(e={}){const{wrapper:a}={...(0,c.R)(),...e.components};return a?(0,r.jsx)(a,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,a,t)=>{t.d(a,{R:()=>o,x:()=>_});var s=t(6540);const r={},c=s.createContext(r);function o(e){const a=s.useContext(c);return s.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function _(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(c.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/cb6f8875.b938f42e.js b/docs/assets/js/cb6f8875.b938f42e.js new file mode 100644 index 00000000..ef27fa38 --- /dev/null +++ b/docs/assets/js/cb6f8875.b938f42e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[1412],{7804:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"getting-started/basics","title":"Installation","description":"In this section you will find information on running the exporter.","source":"@site/versioned_docs/version-2.1.0/getting-started/basics.md","sourceDirName":"getting-started","slug":"/getting-started/basics","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/basics","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/getting-started/basics.md","tags":[],"version":"2.1.0","sidebarPosition":1,"frontMatter":{"title":"Installation","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/getting-started"},"next":{"title":"Default Metrics","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/default-metrics"}}');var a=t(4848),s=t(8453);const i={title:"Installation",sidebar_position:1},r="Installation",l={},c=[{value:"Database Permissions",id:"database-permissions",level:2},{value:"Docker, Podman, etc",id:"docker-podman-etc",level:2},{value:"Oracle Database Free",id:"oracle-database-free",level:3},{value:"Exporter",id:"exporter",level:3},{value:"Simple connection",id:"simple-connection",level:3},{value:"Standalone Binary",id:"standalone-binary",level:2},{value:"Docker Compose",id:"docker-compose",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"installation",children:"Installation"})}),"\n",(0,a.jsx)(n.p,{children:"In this section you will find information on running the exporter."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["In a container runtime like ",(0,a.jsx)(n.a,{href:"#docker-podman-etc",children:"Docker, Podman, etc"})]}),"\n",(0,a.jsxs)(n.li,{children:["In a test/demo environment using ",(0,a.jsx)(n.a,{href:"#docker-compose",children:"Docker Compose"})]}),"\n",(0,a.jsxs)(n.li,{children:["In ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/kubernetes",children:"Kubernetes"})]}),"\n",(0,a.jsxs)(n.li,{children:["As a ",(0,a.jsx)(n.a,{href:"#standalone-binary",children:"standalone binary"})]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"database-permissions",children:"Database Permissions"}),"\n",(0,a.jsxs)(n.p,{children:["For the built-in default metrics, the exporter database database user must have the ",(0,a.jsx)(n.code,{children:"SELECT_CATALOG_ROLE"})," privilege and/or ",(0,a.jsx)(n.code,{children:"SELECT"})," permission on the following objects:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"dba_tablespace_usage_metrics\ndba_tablespaces\ngv$system_wait_class\ngv$asm_diskgroup_stat\ngv$datafile\ngv$sysstat\ngv$process\ngv$waitclassmetric\ngv$session\ngv$resource_limit\ngv$parameter\ngv$database\ngv$sqlstats\ngv$sysmetric\nv$diag_alert_ext (for alert logs only)\n"})}),"\n",(0,a.jsx)(n.h2,{id:"docker-podman-etc",children:"Docker, Podman, etc"}),"\n",(0,a.jsxs)(n.p,{children:["You can run the exporter in a local container using a container image from ",(0,a.jsx)(n.a,{href:"https://container-registry.oracle.com",children:"Oracle Container Registry"}),'. The container image is available in the "observability-exporter" repository in the "Database" category. No authentication or license presentment/acceptance are required to pull this image from the registry.']}),"\n",(0,a.jsx)(n.h3,{id:"oracle-database-free",children:"Oracle Database Free"}),"\n",(0,a.jsxs)(n.p,{children:["If you need an Oracle Database to test the exporter, you can use this command to start up an instance of ",(0,a.jsx)(n.a,{href:"https://www.oracle.com/database/free/",children:"Oracle Database Free"})," which also requires no authentication or license presentment/acceptance to pull the image."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker run --name free23ai \\\n -d \\\n -p 1521:1521 \\\n -e ORACLE_PASSWORD=Welcome12345 \\\n gvenzl/oracle-free:23.9-slim-faststart\n"})}),"\n",(0,a.jsx)(n.p,{children:'This will pull the image and start up the database with a listener on port 1521. It will also create a pluggable database (a database container) called "FREEPDB1" and will set the admin passwords to the password you specified on this command.'}),"\n",(0,a.jsx)(n.p,{children:"You can tail the logs to see when the database is ready to use:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker logs -f free23ai\n\n(look for this message...)\n#########################\nDATABASE IS READY TO USE!\n#########################\n"})}),"\n",(0,a.jsx)(n.p,{children:'To obtain the IP address of the container, which you will need to connect to the database, use this command. Note: depending on your platform and container runtime, you may be able to access the database at "localhost":'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'docker inspect free23ai | grep IPA\n "SecondaryIPAddresses": null,\n "IPAddress": "172.17.0.2",\n "IPAMConfig": null,\n "IPAddress": "172.17.0.2",\n'})}),"\n",(0,a.jsx)(n.h3,{id:"exporter",children:"Exporter"}),"\n",(0,a.jsx)(n.p,{children:"You need to give the exporter the connection details for the Oracle Database that you want it to run against. You can use a simple connection, or a wallet."}),"\n",(0,a.jsx)(n.h3,{id:"simple-connection",children:"Simple connection"}),"\n",(0,a.jsx)(n.p,{children:"For a simple connection, you will provide the details using these variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_USERNAME"})," is the database username, e.g., ",(0,a.jsx)(n.code,{children:"pdbadmin"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_PASSWORD"})," is the password for that user, e.g., ",(0,a.jsx)(n.code,{children:"Welcome12345"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_CONNECT_STRING"})," is the connection string, e.g., ",(0,a.jsx)(n.code,{children:"free23ai:1521/freepdb"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_ROLE"})," (Optional) can be set to ",(0,a.jsx)(n.code,{children:"SYSDBA"}),", ",(0,a.jsx)(n.code,{children:"SYSOPER"}),", ",(0,a.jsx)(n.code,{children:"SYSBACKUP"}),", ",(0,a.jsx)(n.code,{children:"SYSDG"}),", ",(0,a.jsx)(n.code,{children:"SYSKM"}),", ",(0,a.jsx)(n.code,{children:"SYSRAC"})," or ",(0,a.jsx)(n.code,{children:"SYSASM"})," if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"To run the exporter in a container and expose the port, use a command like this, with the appropriate values for the environment variables:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"docker run -it --rm \\\n -e DB_USERNAME=pdbadmin \\\n -e DB_PASSWORD=Welcome12345 \\\n -e DB_CONNECT_STRING=free23ai:1521/freepdb \\\n -p 9161:9161 \\\n container-registry.oracle.com/database/observability-exporter:2.1.0\n"})}),"\n",(0,a.jsx)(n.h2,{id:"standalone-binary",children:"Standalone Binary"}),"\n",(0,a.jsxs)(n.p,{children:["Pre-compiled versions for Linux, ARM and Darwin 64-bit can be found under ",(0,a.jsx)(n.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/releases",children:"releases"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In order to run, you'll need the ",(0,a.jsx)(n.a,{href:"http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html",children:"Oracle Instant Client Basic"})," for your operating system. Only the basic version is required for the exporter."]}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["NOTE: If you are running the Standalone binary on a Mac ARM platform you must set the variable ",(0,a.jsx)(n.code,{children:"DYLD_LIBRARY_PATH"})," to the location of where the instant client installed. For example ",(0,a.jsx)(n.code,{children:"export DYLD_LIBRARY_PATH=/lib/oracle/instantclient_23_3"}),"."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The following command line arguments (flags) can be passed to the exporter (the --help flag will show the table below)."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'Usage of oracledb_exporter:\n --config.file="example-config.yaml"\n File with metrics exporter configuration. (env: CONFIG_FILE)\n --web.telemetry-path="/metrics"\n Path under which to expose metrics. (env: TELEMETRY_PATH)\n --default.metrics="default-metrics.toml"\n File with default metrics in a TOML file. (env: DEFAULT_METRICS)\n --custom.metrics="" Comma separated list of file(s) that contain various custom metrics in a TOML format. (env: CUSTOM_METRICS)\n --query.timeout=5 Query timeout (in seconds). (env: QUERY_TIMEOUT)\n --database.maxIdleConns=0 Number of maximum idle connections in the connection pool. (env: DATABASE_MAXIDLECONNS)\n --database.maxOpenConns=10\n Number of maximum open connections in the connection pool. (env: DATABASE_MAXOPENCONNS)\n --database.poolIncrement=-1\n Connection increment when the connection pool reaches max capacity. (env: DATABASE_POOLINCREMENT)\n --database.poolMaxConnections=-1\n Maximum number of connections in the connection pool. (env: DATABASE_POOLMAXCONNECTIONS)\n --database.poolMinConnections=-1\n Minimum number of connections in the connection pool. (env: DATABASE_POOLMINCONNECTIONS)\n --scrape.interval=0s Interval between each scrape. Default is to scrape on collect requests.\n --log.disable=0 Set to 1 to disable alert logs\n --log.interval=15s Interval between log updates (e.g. 5s).\n --log.destination="/log/alert.log"\n File to output the alert log to. (env: LOG_DESTINATION)\n --web.listen-address=:9161 ...\n Addresses on which to expose metrics and web interface. Repeatable for multiple addresses. Examples: `:9100` or `[::1]:9100` for http, `vsock://:9100` for vsock\n --web.config.file="" Path to configuration file that can enable TLS or authentication. See: https://github.com/prometheus/exporter-toolkit/blob/master/docs/web-configuration.md\n --log.level=info Only log messages with the given severity or above. One of: [debug, info, warn, error]\n --log.format=logfmt Output format of log messages. One of: [logfmt, json]\n --[no-]version Show application version.\n'})}),"\n",(0,a.jsx)(n.p,{children:"You may provide the connection details using these variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_USERNAME"})," is the database username, e.g., ",(0,a.jsx)(n.code,{children:"pdbadmin"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_PASSWORD"})," is the password for that user, e.g., ",(0,a.jsx)(n.code,{children:"Welcome12345"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_CONNECT_STRING"})," is the connection string, e.g., ",(0,a.jsx)(n.code,{children:"localhost:1521/freepdb1"})]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"DB_ROLE"})," (Optional) can be set to ",(0,a.jsx)(n.code,{children:"SYSDBA"})," or ",(0,a.jsx)(n.code,{children:"SYSOPER"})," if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"ORACLE_HOME"})," is the location of the Oracle Instant Client, e.g., ",(0,a.jsx)(n.code,{children:"/lib/oracle/21/client64/lib"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"TNS_ADMIN"})," is the location of your (unzipped) wallet. The ",(0,a.jsx)(n.code,{children:"DIRECTORY"})," set in the ",(0,a.jsx)(n.code,{children:"sqlnet.ora"})," file must match the path that it will be mounted on inside the container."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The following example puts the logfile in the current location with the filename ",(0,a.jsx)(n.code,{children:"alert.log"})," and loads the default matrics file (",(0,a.jsx)(n.code,{children:"default-metrics,toml"}),") from the current location."]}),"\n",(0,a.jsxs)(n.p,{children:["If you prefer to provide configuration via a ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/config-file",children:"config file"}),", you may do so with the ",(0,a.jsx)(n.code,{children:"--config.file"}),' argument. The use of a config file over command line arguments is preferred. If a config file is not provided, the "default" database connection is managed by command line arguments.']}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n# If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,\n# \"$test$pwd\" => \"$$test$$pwd\"\n# Otherwise, the value will be expanded as an environment variable.\n\n# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n ## Database connection information for the \"default\" database.\n default:\n ## Database username\n username: ${DB_USERNAME}\n ## Database password\n password: ${DB_PASSWORD}\n ## Database password file\n ## If specified, will load the database password from a file.\n # passwordFile: ${DB_PASSWORD_FILE}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ## Arbitrary labels to add to each metric scraped from this database\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\nmetrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files\n custom:\n - custom-metrics-example/custom-metrics.toml\n\nlog:\n # Path of log file\n destination: /opt/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n\n# Optionally configure prometheus webserver\n#web:\n# listenAddresses: [':9161']\n# systemdSocket: true|false\n# configFile: /path/to/webconfigfile\n"})}),"\n",(0,a.jsx)(n.h3,{id:"docker-compose",children:"Docker Compose"}),"\n",(0,a.jsx)(n.p,{children:'If you would like to set up a test environment with the exporter, you can use the provided "Docker Compose" file in this repository which will start an Oracle Database instance, the exporter, Prometheus and Grafana.'}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd docker-compose\ndocker-compose up -d\n"})}),"\n",(0,a.jsx)(n.p,{children:"The containers will take a short time to start. The first time, the Oracle container might take a few minutes to start while it creates the database instance, but this is a one-time operation, and subequent restarts will be much faster (a few seconds)."}),"\n",(0,a.jsx)(n.p,{children:"Once the containers are all running, you can access the services using these URLs:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"http://localhost:9161/metrics",children:"Exporter"})}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"http://localhost:9090",children:"Prometheus"}),' - try a query for "oracle".']}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"http://localhost:3000",children:"Grafana"}),' - username is "admin" and password is "grafana". An Oracle Database dashboard is provisioned and configured to use data from the exporter.']}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>r});var o=t(6540);const a={},s=o.createContext(a);function i(e){const n=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/cd35152c.a54b61b9.js b/docs/assets/js/cd35152c.e32861fe.js similarity index 98% rename from docs/assets/js/cd35152c.a54b61b9.js rename to docs/assets/js/cd35152c.e32861fe.js index b3763cec..dcc3c9ad 100644 --- a/docs/assets/js/cd35152c.a54b61b9.js +++ b/docs/assets/js/cd35152c.e32861fe.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6601],{4203:(e,i,r)=>{r.r(i),r.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>u,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"releases/builds","title":"Builds","description":"The Oracle Database Metrics Exporter publishes cross-platform builds for each release.","source":"@site/docs/releases/builds.md","sourceDirName":"releases","slug":"/releases/builds","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/builds","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/releases/builds.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Builds","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Changelog","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/changelog"}}');var l=r(4848),s=r(8453);const a={title:"Builds",sidebar_position:3},t=void 0,o={},d=[{value:"Pre-built binaries",id:"pre-built-binaries",level:3},{value:"Container images",id:"container-images",level:3},{value:"Build the Oracle Database Metrics Exporter",id:"build-the-oracle-database-metrics-exporter",level:3},{value:"Install build tools.",id:"install-build-tools",level:4},{value:"How to build metrics exporter binaries",id:"how-to-build-metrics-exporter-binaries",level:4},{value:"How to build metrics exporter container images",id:"how-to-build-metrics-exporter-container-images",level:4},{value:"Build on Oracle Linux",id:"build-on-oracle-linux",level:3},{value:"1. Install build tools",id:"1-install-build-tools",level:4},{value:"2. Clone the exporter git repository",id:"2-clone-the-exporter-git-repository",level:4},{value:"3. Build the binary",id:"3-build-the-binary",level:4}];function c(e){const i={a:"a",code:"code",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.p,{children:"The Oracle Database Metrics Exporter publishes cross-platform builds for each release."}),"\n",(0,l.jsx)(i.p,{children:"Binaries:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"linux/amd64"}),"\n",(0,l.jsx)(i.li,{children:"linux/arm64"}),"\n",(0,l.jsx)(i.li,{children:"darwin/arm64"}),"\n"]}),"\n",(0,l.jsx)(i.p,{children:"Container images:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"linux/amd64"}),"\n",(0,l.jsx)(i.li,{children:"linux/arm64"}),"\n"]}),"\n",(0,l.jsx)(i.h3,{id:"pre-built-binaries",children:"Pre-built binaries"}),"\n",(0,l.jsxs)(i.p,{children:["Download pre-built binaries from the metrics exporter ",(0,l.jsx)(i.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/releases",children:"GitHub Releases page"}),"."]}),"\n",(0,l.jsxs)(i.p,{children:[(0,l.jsx)(i.code,{children:"linux-amd64"}),", ",(0,l.jsx)(i.code,{children:"linux-arm64"}),", and ",(0,l.jsx)(i.code,{children:"darwin-arm64"})," binaries are included, built using GLIBC 2.39. If you require a specific target architecture or are using an older verison of GLIBC, it's recommended to build the metrics exporter binary yourself."]}),"\n",(0,l.jsx)(i.h3,{id:"container-images",children:"Container images"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"docker pull container-registry.oracle.com/database/observability-exporter:${VERSION}\n"})}),"\n",(0,l.jsx)(i.h3,{id:"build-the-oracle-database-metrics-exporter",children:"Build the Oracle Database Metrics Exporter"}),"\n",(0,l.jsx)(i.p,{children:"Follow these steps to build the metrics exporter on a Ubuntu Linux system."}),"\n",(0,l.jsx)(i.h4,{id:"install-build-tools",children:"Install build tools."}),"\n",(0,l.jsxs)(i.p,{children:["Note that ",(0,l.jsx)(i.code,{children:"podman"})," and ",(0,l.jsx)(i.code,{children:"qemu-user-static"})," are only required for container builds."]}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"sudo apt-get -y install podman qemu-user-static golang gcc-aarch64-linux-gnu\n"})}),"\n",(0,l.jsx)(i.h4,{id:"how-to-build-metrics-exporter-binaries",children:"How to build metrics exporter binaries"}),"\n",(0,l.jsx)(i.p,{children:"Linux amd64:"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"make go-build-linux-amd64\n"})}),"\n",(0,l.jsxs)(i.p,{children:["Linux arm64 (requires ",(0,l.jsx)(i.code,{children:"gcc-aarch64-linux-gnu"}),"):"]}),"\n",(0,l.jsx)(i.p,{children:(0,l.jsx)(i.code,{children:"bash make go-build-linux-gcc-arm64 "})}),"\n",(0,l.jsx)(i.p,{children:"Darwin arm64 (requires MacOS platform compilers):"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"make go-build-darwin-arm64\n"})}),"\n",(0,l.jsx)(i.h4,{id:"how-to-build-metrics-exporter-container-images",children:"How to build metrics exporter container images"}),"\n",(0,l.jsx)(i.p,{children:"Creates multi-arch container builds for linux/amd64 and linux/arm64:"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{children:"make podman-build\n"})}),"\n",(0,l.jsx)(i.h3,{id:"build-on-oracle-linux",children:"Build on Oracle Linux"}),"\n",(0,l.jsx)(i.p,{children:"To build on Oracle Linux, follow these steps."}),"\n",(0,l.jsx)(i.h4,{id:"1-install-build-tools",children:"1. Install build tools"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"dnf install -y git golang make\n"})}),"\n",(0,l.jsx)(i.h4,{id:"2-clone-the-exporter-git-repository",children:"2. Clone the exporter git repository"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"git clone git@github.com:oracle/oracle-db-appdev-monitoring.git\n"})}),"\n",(0,l.jsx)(i.h4,{id:"3-build-the-binary",children:"3. Build the binary"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"cd oracle-db-appdev-monitoring\nmake go-build\n"})}),"\n",(0,l.jsxs)(i.p,{children:["You will now have a tar.gz and binary file in the ",(0,l.jsx)(i.code,{children:"dist/"})," directory, named according to your target platform."]}),"\n",(0,l.jsx)(i.p,{children:"For example, for the darwin-arm64 platform:"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{children:"dist/\n\u251c\u2500\u2500 oracledb_exporter-2.1.0.darwin-arm64\n\u2502 \u2514\u2500\u2500 oracledb_exporter\n\u2514\u2500\u2500 oracledb_exporter-2.1.0.darwin-arm64.tar.gz\n"})})]})}function u(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,l.jsx)(i,{...e,children:(0,l.jsx)(c,{...e})}):c(e)}},8453:(e,i,r)=>{r.d(i,{R:()=>a,x:()=>t});var n=r(6540);const l={},s=n.createContext(l);function a(e){const i=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function t(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:a(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6601],{4203:(e,i,r)=>{r.r(i),r.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>u,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"releases/builds","title":"Builds","description":"The Oracle Database Metrics Exporter publishes cross-platform builds for each release.","source":"@site/docs/releases/builds.md","sourceDirName":"releases","slug":"/releases/builds","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/builds","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/releases/builds.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"title":"Builds","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Changelog","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/changelog"}}');var l=r(4848),s=r(8453);const a={title:"Builds",sidebar_position:3},t=void 0,o={},d=[{value:"Pre-built binaries",id:"pre-built-binaries",level:3},{value:"Container images",id:"container-images",level:3},{value:"Build the Oracle Database Metrics Exporter",id:"build-the-oracle-database-metrics-exporter",level:3},{value:"Install build tools.",id:"install-build-tools",level:4},{value:"How to build metrics exporter binaries",id:"how-to-build-metrics-exporter-binaries",level:4},{value:"How to build metrics exporter container images",id:"how-to-build-metrics-exporter-container-images",level:4},{value:"Build on Oracle Linux",id:"build-on-oracle-linux",level:3},{value:"1. Install build tools",id:"1-install-build-tools",level:4},{value:"2. Clone the exporter git repository",id:"2-clone-the-exporter-git-repository",level:4},{value:"3. Build the binary",id:"3-build-the-binary",level:4}];function c(e){const i={a:"a",code:"code",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.p,{children:"The Oracle Database Metrics Exporter publishes cross-platform builds for each release."}),"\n",(0,l.jsx)(i.p,{children:"Binaries:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"linux/amd64"}),"\n",(0,l.jsx)(i.li,{children:"linux/arm64"}),"\n",(0,l.jsx)(i.li,{children:"darwin/arm64"}),"\n"]}),"\n",(0,l.jsx)(i.p,{children:"Container images:"}),"\n",(0,l.jsxs)(i.ul,{children:["\n",(0,l.jsx)(i.li,{children:"linux/amd64"}),"\n",(0,l.jsx)(i.li,{children:"linux/arm64"}),"\n"]}),"\n",(0,l.jsx)(i.h3,{id:"pre-built-binaries",children:"Pre-built binaries"}),"\n",(0,l.jsxs)(i.p,{children:["Download pre-built binaries from the metrics exporter ",(0,l.jsx)(i.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/releases",children:"GitHub Releases page"}),"."]}),"\n",(0,l.jsxs)(i.p,{children:[(0,l.jsx)(i.code,{children:"linux-amd64"}),", ",(0,l.jsx)(i.code,{children:"linux-arm64"}),", and ",(0,l.jsx)(i.code,{children:"darwin-arm64"})," binaries are included, built using GLIBC 2.39. If you require a specific target architecture or are using an older verison of GLIBC, it's recommended to build the metrics exporter binary yourself."]}),"\n",(0,l.jsx)(i.h3,{id:"container-images",children:"Container images"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"docker pull container-registry.oracle.com/database/observability-exporter:${VERSION}\n"})}),"\n",(0,l.jsx)(i.h3,{id:"build-the-oracle-database-metrics-exporter",children:"Build the Oracle Database Metrics Exporter"}),"\n",(0,l.jsx)(i.p,{children:"Follow these steps to build the metrics exporter on a Ubuntu Linux system."}),"\n",(0,l.jsx)(i.h4,{id:"install-build-tools",children:"Install build tools."}),"\n",(0,l.jsxs)(i.p,{children:["Note that ",(0,l.jsx)(i.code,{children:"podman"})," and ",(0,l.jsx)(i.code,{children:"qemu-user-static"})," are only required for container builds."]}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"sudo apt-get -y install podman qemu-user-static golang gcc-aarch64-linux-gnu\n"})}),"\n",(0,l.jsx)(i.h4,{id:"how-to-build-metrics-exporter-binaries",children:"How to build metrics exporter binaries"}),"\n",(0,l.jsx)(i.p,{children:"Linux amd64:"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"make go-build-linux-amd64\n"})}),"\n",(0,l.jsxs)(i.p,{children:["Linux arm64 (requires ",(0,l.jsx)(i.code,{children:"gcc-aarch64-linux-gnu"}),"):"]}),"\n",(0,l.jsx)(i.p,{children:(0,l.jsx)(i.code,{children:"bash make go-build-linux-gcc-arm64 "})}),"\n",(0,l.jsx)(i.p,{children:"Darwin arm64 (requires MacOS platform compilers):"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"make go-build-darwin-arm64\n"})}),"\n",(0,l.jsx)(i.h4,{id:"how-to-build-metrics-exporter-container-images",children:"How to build metrics exporter container images"}),"\n",(0,l.jsx)(i.p,{children:"Creates multi-arch container builds for linux/amd64 and linux/arm64:"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{children:"make podman-build\n"})}),"\n",(0,l.jsx)(i.h3,{id:"build-on-oracle-linux",children:"Build on Oracle Linux"}),"\n",(0,l.jsx)(i.p,{children:"To build on Oracle Linux, follow these steps."}),"\n",(0,l.jsx)(i.h4,{id:"1-install-build-tools",children:"1. Install build tools"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"dnf install -y git golang make\n"})}),"\n",(0,l.jsx)(i.h4,{id:"2-clone-the-exporter-git-repository",children:"2. Clone the exporter git repository"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"git clone git@github.com:oracle/oracle-db-appdev-monitoring.git\n"})}),"\n",(0,l.jsx)(i.h4,{id:"3-build-the-binary",children:"3. Build the binary"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{className:"language-bash",children:"cd oracle-db-appdev-monitoring\nmake go-build\n"})}),"\n",(0,l.jsxs)(i.p,{children:["You will now have a tar.gz and binary file in the ",(0,l.jsx)(i.code,{children:"dist/"})," directory, named according to your target platform."]}),"\n",(0,l.jsx)(i.p,{children:"For example, for the darwin-arm64 platform:"}),"\n",(0,l.jsx)(i.pre,{children:(0,l.jsx)(i.code,{children:"dist/\n\u251c\u2500\u2500 oracledb_exporter-2.2.0.darwin-arm64\n\u2502 \u2514\u2500\u2500 oracledb_exporter\n\u2514\u2500\u2500 oracledb_exporter-2.2.0.darwin-arm64.tar.gz\n"})})]})}function u(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,l.jsx)(i,{...e,children:(0,l.jsx)(c,{...e})}):c(e)}},8453:(e,i,r)=>{r.d(i,{R:()=>a,x:()=>t});var n=r(6540);const l={},s=n.createContext(l);function a(e){const i=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function t(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:a(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/cf0dfdd1.23193cd8.js b/docs/assets/js/cf0dfdd1.23193cd8.js new file mode 100644 index 00000000..32f15f82 --- /dev/null +++ b/docs/assets/js/cf0dfdd1.23193cd8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6235],{6330:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":"unreleased","badge":true,"noIndex":false,"className":"docs-version-current","isLast":false,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"OpenTelemetry Metrics for Oracle Database","href":"/oracle-db-appdev-monitoring/docs/next/intro","docId":"intro","unlisted":false},{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Installation","href":"/oracle-db-appdev-monitoring/docs/next/getting-started/basics","docId":"getting-started/basics","unlisted":false},{"type":"link","label":"Default Metrics","href":"/oracle-db-appdev-monitoring/docs/next/getting-started/default-metrics","docId":"getting-started/default-metrics","unlisted":false},{"type":"link","label":"Kubernetes","href":"/oracle-db-appdev-monitoring/docs/next/getting-started/kubernetes","docId":"getting-started/kubernetes","unlisted":false},{"type":"link","label":"Grafana Dashboards","href":"/oracle-db-appdev-monitoring/docs/next/getting-started/grafana-dashboards","docId":"getting-started/grafana-dashboards","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/next/category/getting-started"},{"type":"category","label":"Configuration","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Exporter Configuration","href":"/oracle-db-appdev-monitoring/docs/next/configuration/config-file","docId":"configuration/config-file","unlisted":false},{"type":"link","label":"Custom Metrics","href":"/oracle-db-appdev-monitoring/docs/next/configuration/custom-metrics","docId":"configuration/custom-metrics","unlisted":false},{"type":"link","label":"Multiple Databases","href":"/oracle-db-appdev-monitoring/docs/next/configuration/multiple-databases","docId":"configuration/multiple-databases","unlisted":false},{"type":"link","label":"Oracle Wallet (mTLS)","href":"/oracle-db-appdev-monitoring/docs/next/configuration/oracle-wallet","docId":"configuration/oracle-wallet","unlisted":false},{"type":"link","label":"Alert Logs","href":"/oracle-db-appdev-monitoring/docs/next/configuration/alert-logs","docId":"configuration/alert-logs","unlisted":false},{"type":"link","label":"OCI Vault","href":"/oracle-db-appdev-monitoring/docs/next/configuration/oci-vault","docId":"configuration/oci-vault","unlisted":false},{"type":"link","label":"Azure Vault","href":"/oracle-db-appdev-monitoring/docs/next/configuration/azure-vault","docId":"configuration/azure-vault","unlisted":false},{"type":"link","label":"HashiCorp Vault","href":"/oracle-db-appdev-monitoring/docs/next/configuration/hashicorp-vault","docId":"configuration/hashicorp-vault","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/next/category/configuration"},{"type":"category","label":"Advanced","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuring the Go Runtime","href":"/oracle-db-appdev-monitoring/docs/next/advanced/go-runtime","docId":"advanced/go-runtime","unlisted":false},{"type":"link","label":"Monitoring TxEventQ","href":"/oracle-db-appdev-monitoring/docs/next/advanced/txeventq","docId":"advanced/txeventq","unlisted":false},{"type":"link","label":"Development","href":"/oracle-db-appdev-monitoring/docs/next/advanced/development","docId":"advanced/development","unlisted":false},{"type":"link","label":"Compatibility with Older Database Versions","href":"/oracle-db-appdev-monitoring/docs/next/advanced/older-versions","docId":"advanced/older-versions","unlisted":false},{"type":"link","label":"go-ora Driver","href":"/oracle-db-appdev-monitoring/docs/next/advanced/go-ora","docId":"advanced/go-ora","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/next/category/advanced"},{"type":"category","label":"Releases","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Roadmap","href":"/oracle-db-appdev-monitoring/docs/next/releases/roadmap","docId":"releases/roadmap","unlisted":false},{"type":"link","label":"Changelog","href":"/oracle-db-appdev-monitoring/docs/next/releases/changelog","docId":"releases/changelog","unlisted":false},{"type":"link","label":"Builds","href":"/oracle-db-appdev-monitoring/docs/next/releases/builds","docId":"releases/builds","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/next/category/releases"}]},"docs":{"advanced/development":{"id":"advanced/development","title":"Development","description":"The exporter is a Go program using the Prometheus SDK.","sidebar":"tutorialSidebar"},"advanced/go-ora":{"id":"advanced/go-ora","title":"go-ora Driver","description":"The Oracle Database Metrics Exporter experimentally supports compiling with the go-ora database driver. By default, the exporter compiles using the godror database driver, which uses CGO execution to invoke Oracle Instant Client. the go-ora driver presents an option for users who want to use a \\"thin\\" database client without the Oracle Instant Client and CGO.","sidebar":"tutorialSidebar"},"advanced/go-runtime":{"id":"advanced/go-runtime","title":"Configuring the Go Runtime","description":"If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter\'s usage of memory.","sidebar":"tutorialSidebar"},"advanced/older-versions":{"id":"advanced/older-versions","title":"Compatibility with Older Database Versions","description":"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.","sidebar":"tutorialSidebar"},"advanced/txeventq":{"id":"advanced/txeventq","title":"Monitoring TxEventQ","description":"Oracle Transactional Event Queues (\\"TxEventQ\\") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.","sidebar":"tutorialSidebar"},"configuration/alert-logs":{"id":"configuration/alert-logs","title":"Alert Logs","description":"Collect export alert logs with a log ingestion tool.","sidebar":"tutorialSidebar"},"configuration/azure-vault":{"id":"configuration/azure-vault","title":"Azure Vault","description":"Securely load database credentials from Azure Vault.","sidebar":"tutorialSidebar"},"configuration/config-file":{"id":"configuration/config-file","title":"Exporter Configuration","description":"The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.","sidebar":"tutorialSidebar"},"configuration/custom-metrics":{"id":"configuration/custom-metrics","title":"Custom Metrics","description":"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.","sidebar":"tutorialSidebar"},"configuration/hashicorp-vault":{"id":"configuration/hashicorp-vault","title":"HashiCorp Vault","description":"Securely load database credentials from HashiCorp Vault.","sidebar":"tutorialSidebar"},"configuration/multiple-databases":{"id":"configuration/multiple-databases","title":"Multiple Databases","description":"The exporter may be configured to scrape as many databases as needed.","sidebar":"tutorialSidebar"},"configuration/oci-vault":{"id":"configuration/oci-vault","title":"OCI Vault","description":"Securely load database credentials from OCI Vault.","sidebar":"tutorialSidebar"},"configuration/oracle-wallet":{"id":"configuration/oracle-wallet","title":"Oracle Wallet (mTLS)","description":"For mutual TLS (mTLS) connections, you must use an Oracle Wallet.","sidebar":"tutorialSidebar"},"getting-started/basics":{"id":"getting-started/basics","title":"Installation","description":"In this section you will find information on running the exporter.","sidebar":"tutorialSidebar"},"getting-started/default-metrics":{"id":"getting-started/default-metrics","title":"Default Metrics","description":"The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.","sidebar":"tutorialSidebar"},"getting-started/grafana-dashboards":{"id":"getting-started/grafana-dashboards","title":"Grafana Dashboards","description":"Sample Grafana dashboards are included with the exporter.","sidebar":"tutorialSidebar"},"getting-started/kubernetes":{"id":"getting-started/kubernetes","title":"Kubernetes","description":"You can run the exporter in Kubernetes using provided manifests.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"OpenTelemetry Metrics for Oracle Database","description":"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.","sidebar":"tutorialSidebar"},"releases/builds":{"id":"releases/builds","title":"Builds","description":"The Oracle Database Metrics Exporter publishes cross-platform builds for each release.","sidebar":"tutorialSidebar"},"releases/changelog":{"id":"releases/changelog","title":"Changelog","description":"List of upcoming and historic changes to the exporter.","sidebar":"tutorialSidebar"},"releases/roadmap":{"id":"releases/roadmap","title":"Roadmap","description":"Planned and upcoming features for the exporter.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/cf0dfdd1.26f128a4.js b/docs/assets/js/cf0dfdd1.26f128a4.js deleted file mode 100644 index 94e27a76..00000000 --- a/docs/assets/js/cf0dfdd1.26f128a4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[6235],{6330:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":"unreleased","badge":true,"noIndex":false,"className":"docs-version-current","isLast":false,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"OpenTelemetry Metrics for Oracle Database","href":"/oracle-db-appdev-monitoring/docs/next/intro","docId":"intro","unlisted":false},{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Installation","href":"/oracle-db-appdev-monitoring/docs/next/getting-started/basics","docId":"getting-started/basics","unlisted":false},{"type":"link","label":"Default Metrics","href":"/oracle-db-appdev-monitoring/docs/next/getting-started/default-metrics","docId":"getting-started/default-metrics","unlisted":false},{"type":"link","label":"Kubernetes","href":"/oracle-db-appdev-monitoring/docs/next/getting-started/kubernetes","docId":"getting-started/kubernetes","unlisted":false},{"type":"link","label":"Grafana Dashboards","href":"/oracle-db-appdev-monitoring/docs/next/getting-started/grafana-dashboards","docId":"getting-started/grafana-dashboards","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/next/category/getting-started"},{"type":"category","label":"Configuration","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Exporter Configuration","href":"/oracle-db-appdev-monitoring/docs/next/configuration/config-file","docId":"configuration/config-file","unlisted":false},{"type":"link","label":"Custom Metrics","href":"/oracle-db-appdev-monitoring/docs/next/configuration/custom-metrics","docId":"configuration/custom-metrics","unlisted":false},{"type":"link","label":"Multiple Databases","href":"/oracle-db-appdev-monitoring/docs/next/configuration/multiple-databases","docId":"configuration/multiple-databases","unlisted":false},{"type":"link","label":"Oracle Wallet (mTLS)","href":"/oracle-db-appdev-monitoring/docs/next/configuration/oracle-wallet","docId":"configuration/oracle-wallet","unlisted":false},{"type":"link","label":"Alert Logs","href":"/oracle-db-appdev-monitoring/docs/next/configuration/alert-logs","docId":"configuration/alert-logs","unlisted":false},{"type":"link","label":"OCI Vault","href":"/oracle-db-appdev-monitoring/docs/next/configuration/oci-vault","docId":"configuration/oci-vault","unlisted":false},{"type":"link","label":"Azure Vault","href":"/oracle-db-appdev-monitoring/docs/next/configuration/azure-vault","docId":"configuration/azure-vault","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/next/category/configuration"},{"type":"category","label":"Advanced","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuring the Go Runtime","href":"/oracle-db-appdev-monitoring/docs/next/advanced/go-runtime","docId":"advanced/go-runtime","unlisted":false},{"type":"link","label":"Monitoring TxEventQ","href":"/oracle-db-appdev-monitoring/docs/next/advanced/txeventq","docId":"advanced/txeventq","unlisted":false},{"type":"link","label":"Development","href":"/oracle-db-appdev-monitoring/docs/next/advanced/development","docId":"advanced/development","unlisted":false},{"type":"link","label":"Compatibility with Older Database Versions","href":"/oracle-db-appdev-monitoring/docs/next/advanced/older-versions","docId":"advanced/older-versions","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/next/category/advanced"},{"type":"category","label":"Releases","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Roadmap","href":"/oracle-db-appdev-monitoring/docs/next/releases/roadmap","docId":"releases/roadmap","unlisted":false},{"type":"link","label":"Changelog","href":"/oracle-db-appdev-monitoring/docs/next/releases/changelog","docId":"releases/changelog","unlisted":false},{"type":"link","label":"Builds","href":"/oracle-db-appdev-monitoring/docs/next/releases/builds","docId":"releases/builds","unlisted":false}],"href":"/oracle-db-appdev-monitoring/docs/next/category/releases"}]},"docs":{"advanced/development":{"id":"advanced/development","title":"Development","description":"The exporter is a Go program using the Prometheus SDK.","sidebar":"tutorialSidebar"},"advanced/go-runtime":{"id":"advanced/go-runtime","title":"Configuring the Go Runtime","description":"If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter\'s usage of memory.","sidebar":"tutorialSidebar"},"advanced/older-versions":{"id":"advanced/older-versions","title":"Compatibility with Older Database Versions","description":"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.","sidebar":"tutorialSidebar"},"advanced/txeventq":{"id":"advanced/txeventq","title":"Monitoring TxEventQ","description":"Oracle Transactional Event Queues (\\"TxEventQ\\") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.","sidebar":"tutorialSidebar"},"configuration/alert-logs":{"id":"configuration/alert-logs","title":"Alert Logs","description":"Collect export alert logs with a log ingestion tool.","sidebar":"tutorialSidebar"},"configuration/azure-vault":{"id":"configuration/azure-vault","title":"Azure Vault","description":"Securely load database credentials from Azure Vault.","sidebar":"tutorialSidebar"},"configuration/config-file":{"id":"configuration/config-file","title":"Exporter Configuration","description":"The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.","sidebar":"tutorialSidebar"},"configuration/custom-metrics":{"id":"configuration/custom-metrics","title":"Custom Metrics","description":"The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.","sidebar":"tutorialSidebar"},"configuration/multiple-databases":{"id":"configuration/multiple-databases","title":"Multiple Databases","description":"The exporter may be configured to scrape as many databases as needed.","sidebar":"tutorialSidebar"},"configuration/oci-vault":{"id":"configuration/oci-vault","title":"OCI Vault","description":"Securely load database credentials from OCI Vault.","sidebar":"tutorialSidebar"},"configuration/oracle-wallet":{"id":"configuration/oracle-wallet","title":"Oracle Wallet (mTLS)","description":"For mutual TLS (mTLS) connections, you must use an Oracle Wallet.","sidebar":"tutorialSidebar"},"getting-started/basics":{"id":"getting-started/basics","title":"Installation","description":"In this section you will find information on running the exporter.","sidebar":"tutorialSidebar"},"getting-started/default-metrics":{"id":"getting-started/default-metrics","title":"Default Metrics","description":"The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.","sidebar":"tutorialSidebar"},"getting-started/grafana-dashboards":{"id":"getting-started/grafana-dashboards","title":"Grafana Dashboards","description":"Sample Grafana dashboards are included with the exporter.","sidebar":"tutorialSidebar"},"getting-started/kubernetes":{"id":"getting-started/kubernetes","title":"Kubernetes","description":"You can run the exporter in Kubernetes using provided manifests.","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"OpenTelemetry Metrics for Oracle Database","description":"The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.","sidebar":"tutorialSidebar"},"releases/builds":{"id":"releases/builds","title":"Builds","description":"The Oracle Database Metrics Exporter publishes cross-platform builds for each release.","sidebar":"tutorialSidebar"},"releases/changelog":{"id":"releases/changelog","title":"Changelog","description":"List of upcoming and historic changes to the exporter.","sidebar":"tutorialSidebar"},"releases/roadmap":{"id":"releases/roadmap","title":"Roadmap","description":"Planned and upcoming features for the exporter.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/cfb8cbdc.fff6dee6.js b/docs/assets/js/cfb8cbdc.fff6dee6.js new file mode 100644 index 00000000..57ccd810 --- /dev/null +++ b/docs/assets/js/cfb8cbdc.fff6dee6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[9226],{3122:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"configuration/config-file","title":"Exporter Configuration","description":"The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.","source":"@site/versioned_docs/version-2.1.0/configuration/config-file.md","sourceDirName":"configuration","slug":"/configuration/config-file","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/config-file","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/config-file.md","tags":[],"version":"2.1.0","sidebarPosition":1,"frontMatter":{"title":"Exporter Configuration","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Configuration","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/configuration"},"next":{"title":"Custom Metrics","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/custom-metrics"}}');var a=o(4848),i=o(8453);const r={title:"Exporter Configuration",sidebar_position:1},s="Exporter Configuration",c={},l=[{value:"Scrape on request vs. Scrape on interval",id:"scrape-on-request-vs-scrape-on-interval",level:3},{value:"Config file in a container image",id:"config-file-in-a-container-image",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"exporter-configuration",children:"Exporter Configuration"})}),"\n",(0,a.jsxs)(n.p,{children:["The recommended way to configure the exporter is with the ",(0,a.jsx)(n.code,{children:"--config.file"})," argument, specifying a YAML configuration file."]}),"\n",(0,a.jsx)(n.p,{children:"The configuration file contains the following options:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n# If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,\n# \"$test$pwd\" => \"$$test$$pwd\"\n# Otherwise, the value will be expanded as an environment variable.\n\n# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n ## Database connection information for the \"default\" database.\n default:\n ## Database username\n username: ${DB_USERNAME}\n ## Database password\n password: ${DB_PASSWORD}\n ## Database password file\n ## If specified, will load the database password from a file.\n # passwordFile: ${DB_PASSWORD_FILE}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ## Arbitrary labels to add to each metric scraped from this database\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\nmetrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files\n custom:\n - custom-metrics-example/custom-metrics.toml\n\nlog:\n # Path of log file\n destination: /opt/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n\n# Optionally configure prometheus webserver\n#web:\n# listenAddresses: [':9161']\n# systemdSocket: true|false\n# configFile: /path/to/webconfigfile\n"})}),"\n",(0,a.jsx)(n.h3,{id:"scrape-on-request-vs-scrape-on-interval",children:"Scrape on request vs. Scrape on interval"}),"\n",(0,a.jsxs)(n.p,{children:["The metrics exporter has two scraping modes: scrape on request, and scrape on interval. By default, the metrics exporter scrapes metrics on request, when the ",(0,a.jsx)(n.code,{children:"/metrics"})," endpoint is invoked."]}),"\n",(0,a.jsxs)(n.p,{children:["To scrape metrics on a given interval, set the ",(0,a.jsx)(n.code,{children:"metrics.scrapeInterval"})," property to a valid interval:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"metrics:\n # Metrics will be scraped every 30s.\n scrapeInterval: 30s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["An individual metric may have its own scrape interval separate from the exporter's scrape interval. See the ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/custom-metrics#metric-schema",children:"metric schema"})," for details on configuring per-metric scrape intervals."]}),"\n",(0,a.jsx)(n.h3,{id:"config-file-in-a-container-image",children:"Config file in a container image"}),"\n",(0,a.jsx)(n.p,{children:"To add your custom config file to a container image, you can layer the base exporter image and include that config:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-Dockerfile",children:'FROM container-registry.oracle.com/database/observability-exporter:2.1.0\nCOPY my-exporter-config.yaml /\nENTRYPOINT ["/oracledb_exporter", "--config.file", "/my-exporter-config.yaml"]\n'})})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>s});var t=o(6540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/d00c9ef6.facc97d5.js b/docs/assets/js/d00c9ef6.facc97d5.js new file mode 100644 index 00000000..4c7675b1 --- /dev/null +++ b/docs/assets/js/d00c9ef6.facc97d5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[698],{4905:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>g,frontMatter:()=>l,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"configuration/alert-logs","title":"Alert Logs","description":"Collect export alert logs with a log ingestion tool.","source":"@site/versioned_docs/version-2.1.0/configuration/alert-logs.md","sourceDirName":"configuration","slug":"/configuration/alert-logs","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/alert-logs","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/alert-logs.md","tags":[],"version":"2.1.0","sidebarPosition":5,"frontMatter":{"title":"Alert Logs","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Oracle Wallet (mTLS)","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oracle-wallet"},"next":{"title":"OCI Vault","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oci-vault"}}');var r=o(4848),i=o(8453);const l={title:"Alert Logs",sidebar_position:5},s="Alert logs",a={},d=[];function c(e){const t={code:"code",h1:"h1",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"alert-logs",children:"Alert logs"})}),"\n",(0,r.jsx)(t.p,{children:"Collect export alert logs with a log ingestion tool."}),"\n",(0,r.jsx)(t.p,{children:"The exporter exports alert log records as a JSON file suitable for collection by a log ingestion tool like Promtail or FluentBit."}),"\n",(0,r.jsx)(t.p,{children:"Alert logging is configured with the following parameters in the exporter config file:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Default"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"log.destination"}),(0,r.jsx)(t.td,{children:"Log file path"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"/log/alert.log"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"log.interval"}),(0,r.jsx)(t.td,{children:"Interval to log records"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"15s"})})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"log.disable"}),(0,r.jsxs)(t.td,{children:["Disable logging if set to ",(0,r.jsx)(t.code,{children:"1"})]}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"0"})})]})]})]}),"\n",(0,r.jsx)(t.p,{children:"Example alert log YAML configuration:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:"log:\n # Path of log file\n destination: /opt/exporter/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n"})})]})}function g(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>l,x:()=>s});var n=o(6540);const r={},i=n.createContext(r);function l(e){const t=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/ff66e47b.3508c712.js b/docs/assets/js/d06c6fda.446136c8.js similarity index 96% rename from docs/assets/js/ff66e47b.3508c712.js rename to docs/assets/js/d06c6fda.446136c8.js index 68abd39d..02d0593d 100644 --- a/docs/assets/js/ff66e47b.3508c712.js +++ b/docs/assets/js/d06c6fda.446136c8.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[5051],{7397:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"configuration/oracle-wallet","title":"Oracle Wallet (mTLS)","description":"For mutual TLS (mTLS) connections, you must use an Oracle Wallet.","source":"@site/versioned_docs/version-2.1.0/configuration/oracle-wallet.md","sourceDirName":"configuration","slug":"/configuration/oracle-wallet","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oracle-wallet","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/oracle-wallet.md","tags":[],"version":"2.1.0","sidebarPosition":4,"frontMatter":{"title":"Oracle Wallet (mTLS)","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Multiple Databases","permalink":"/oracle-db-appdev-monitoring/docs/configuration/multiple-databases"},"next":{"title":"Alert Logs","permalink":"/oracle-db-appdev-monitoring/docs/configuration/alert-logs"}}');var o=t(4848),l=t(8453);const r={title:"Oracle Wallet (mTLS)",sidebar_position:4},s="Using a Wallet",i={},c=[{value:"mTLS for multiple databases with Oracle Wallet",id:"mtls-for-multiple-databases-with-oracle-wallet",level:3}];function d(e){const n={code:"code",h1:"h1",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"using-a-wallet",children:"Using a Wallet"})}),"\n",(0,o.jsx)(n.p,{children:"For mutual TLS (mTLS) connections, you must use an Oracle Wallet."}),"\n",(0,o.jsx)(n.p,{children:"If you are using Oracle Autonomous Database with mTLS, for example, you can download and unzip the wallet from the Oracle Cloud Infrastructure (OCI) console."}),"\n",(0,o.jsx)(n.p,{children:"To configure the exporter to use an Oracle Wallet,"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Set the ",(0,o.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable to the directory containing the unzipped wallet"]}),"\n",(0,o.jsx)(n.li,{children:"Configure your database instance with the appropriate database TNS name:"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"databases:\n mydb:\n username: admin\n password: \n # TNS Name from wallet tnsnames.ora file, e.g., mydb_high\n url: \n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you are running the exporter as a container, you can mount the wallet as a volume. For example, mounting the ",(0,o.jsx)(n.code,{children:"./wallet"})," directory to the ",(0,o.jsx)(n.code,{children:"/wallet"})," location:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"docker run -it --rm \\\n -e DB_USERNAME=pdbadmin \\\n -e DB_PASSWORD=Welcome12345 \\\n -e DB_CONNECT_STRING=devdb_tp \\\n -v ./wallet:/wallet \\\n -p 9161:9161 \\\n container-registry.oracle.com/database/observability-exporter:2.1.0\n"})}),"\n",(0,o.jsx)(n.h3,{id:"mtls-for-multiple-databases-with-oracle-wallet",children:"mTLS for multiple databases with Oracle Wallet"}),"\n",(0,o.jsxs)(n.p,{children:["The Oracle Database Metrics exporter uses ODPI-C, which can only initalize the TNS aliases from a ",(0,o.jsx)(n.code,{children:"tnsnames.ora"}),' file once per process. To work around this, the exporter can be configured to read from a "combined" ',(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file containing all TNS aliases for connections in a multi-database configuration."]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"For each database the exporter will connect to, download the corresponding wallet files. If you're using ADB/ATP-S, download the regional wallet instead of the instance wallet if the databases are in the same region."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Copy the TNS aliases the ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file from each wallet, and combine them into one file, so all your database service names are in one file together"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["In the combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file, and add the following snippet to each TNS alias connection string, to tell the client where the wallet directory is:"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"(security=(MY_WALLET_DIRECTORY=/path/to/this/database/wallet))\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file, which contains the TNS aliases for both databases, and their corresponding wallet location in the ",(0,o.jsx)(n.code,{children:"security"})," configuration will look something like the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sql",children:"db1_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db1)(ssl_server_dn_match=yes)))\n\ndb2_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db2)(ssl_server_dn_match=yes)))\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"4",children:["\n",(0,o.jsxs)(n.li,{children:["Take wallet files (cwallet.sso, ewallet.p12, & ewallet.pem) for each database, and place them in separate directories. For example, ",(0,o.jsx)(n.code,{children:"db1"})," gets its own directory, ",(0,o.jsx)(n.code,{children:"db2"})," gets its own directory, and so forth."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["The resulting directory structure should look like the following, with wallet information separate from the combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"wallets\n\u251c\u2500\u2500 combined\n\u2502 \u251c\u2500\u2500 sqlnet.ora\n\u2502 \u2514\u2500\u2500 tnsnames.ora // Combined tnsnames.ora\n\u251c\u2500\u2500 db1\n\u2502 \u251c\u2500\u2500 cwallet.sso\n\u2502 \u251c\u2500\u2500 ewallet.p12\n\u2502 \u2514\u2500\u2500 ewallet.pem\n\u2514\u2500\u2500 db2\n\u251c\u2500\u2500 cwallet.sso\n\u251c\u2500\u2500 ewallet.p12\n\u2514\u2500\u2500 ewallet.pem\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsxs)(n.li,{children:["Set the ",(0,o.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable where the exporter is running to the directory containing your combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"export TNS_ADMIN=/wallets/combined\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"6",children:["\n",(0,o.jsxs)(n.li,{children:["Finally, update the exporter configuration file to include the TNS aliases for all databases you will be connecting to. Ensure your database configuration file does not use the ",(0,o.jsx)(n.code,{children:"tnsAdmin"})," property, as we are using the global ",(0,o.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable to point to the combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"databases:\n db2:\n username: ****\n password: ****\n url: db2_high\n queryTimeout: 5\n maxOpenConns: 10\n maxIdleConns: 10\n db1:\n username: ****\n password: ****\n url: db1_high\n queryTimeout: 5\n maxOpenConns: 10\n maxIdleConns: 10\n"})}),"\n",(0,o.jsx)(n.p,{children:"Then, run the exporter with the config file:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-shell",children:"./oracledb_exporter --config.file=my-config-file.yaml\n"})})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var a=t(6540);const o={},l=a.createContext(o);function r(e){const n=a.useContext(l);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4751],{4297:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"configuration/oracle-wallet","title":"Oracle Wallet (mTLS)","description":"For mutual TLS (mTLS) connections, you must use an Oracle Wallet.","source":"@site/versioned_docs/version-2.2.0/configuration/oracle-wallet.md","sourceDirName":"configuration","slug":"/configuration/oracle-wallet","permalink":"/oracle-db-appdev-monitoring/docs/configuration/oracle-wallet","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.2.0/configuration/oracle-wallet.md","tags":[],"version":"2.2.0","sidebarPosition":4,"frontMatter":{"title":"Oracle Wallet (mTLS)","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Multiple Databases","permalink":"/oracle-db-appdev-monitoring/docs/configuration/multiple-databases"},"next":{"title":"Alert Logs","permalink":"/oracle-db-appdev-monitoring/docs/configuration/alert-logs"}}');var o=t(4848),l=t(8453);const r={title:"Oracle Wallet (mTLS)",sidebar_position:4},s="Using a Wallet",i={},c=[{value:"mTLS for multiple databases with Oracle Wallet",id:"mtls-for-multiple-databases-with-oracle-wallet",level:3}];function d(e){const n={code:"code",h1:"h1",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"using-a-wallet",children:"Using a Wallet"})}),"\n",(0,o.jsx)(n.p,{children:"For mutual TLS (mTLS) connections, you must use an Oracle Wallet."}),"\n",(0,o.jsx)(n.p,{children:"If you are using Oracle Autonomous Database with mTLS, for example, you can download and unzip the wallet from the Oracle Cloud Infrastructure (OCI) console."}),"\n",(0,o.jsx)(n.p,{children:"To configure the exporter to use an Oracle Wallet,"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Set the ",(0,o.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable to the directory containing the unzipped wallet"]}),"\n",(0,o.jsx)(n.li,{children:"Configure your database instance with the appropriate database TNS name:"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"databases:\n mydb:\n username: admin\n password: \n # TNS Name from wallet tnsnames.ora file, e.g., mydb_high\n url: \n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you are running the exporter as a container, you can mount the wallet as a volume. For example, mounting the ",(0,o.jsx)(n.code,{children:"./wallet"})," directory to the ",(0,o.jsx)(n.code,{children:"/wallet"})," location:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"docker run -it --rm \\\n -e DB_USERNAME=pdbadmin \\\n -e DB_PASSWORD=Welcome12345 \\\n -e DB_CONNECT_STRING=devdb_tp \\\n -v ./wallet:/wallet \\\n -p 9161:9161 \\\n container-registry.oracle.com/database/observability-exporter:2.2.0\n"})}),"\n",(0,o.jsx)(n.h3,{id:"mtls-for-multiple-databases-with-oracle-wallet",children:"mTLS for multiple databases with Oracle Wallet"}),"\n",(0,o.jsxs)(n.p,{children:["The Oracle Database Metrics exporter uses ODPI-C, which can only initalize the TNS aliases from a ",(0,o.jsx)(n.code,{children:"tnsnames.ora"}),' file once per process. To work around this, the exporter can be configured to read from a "combined" ',(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file containing all TNS aliases for connections in a multi-database configuration."]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"For each database the exporter will connect to, download the corresponding wallet files. If you're using ADB/ATP-S, download the regional wallet instead of the instance wallet if the databases are in the same region."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Copy the TNS aliases the ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file from each wallet, and combine them into one file, so all your database service names are in one file together"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["In the combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file, and add the following snippet to each TNS alias connection string, to tell the client where the wallet directory is:"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"(security=(MY_WALLET_DIRECTORY=/path/to/this/database/wallet))\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file, which contains the TNS aliases for both databases, and their corresponding wallet location in the ",(0,o.jsx)(n.code,{children:"security"})," configuration will look something like the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sql",children:"db1_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db1)(ssl_server_dn_match=yes)))\n\ndb2_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db2)(ssl_server_dn_match=yes)))\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"4",children:["\n",(0,o.jsxs)(n.li,{children:["Take wallet files (cwallet.sso, ewallet.p12, & ewallet.pem) for each database, and place them in separate directories. For example, ",(0,o.jsx)(n.code,{children:"db1"})," gets its own directory, ",(0,o.jsx)(n.code,{children:"db2"})," gets its own directory, and so forth."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["The resulting directory structure should look like the following, with wallet information separate from the combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"wallets\n\u251c\u2500\u2500 combined\n\u2502 \u251c\u2500\u2500 sqlnet.ora\n\u2502 \u2514\u2500\u2500 tnsnames.ora // Combined tnsnames.ora\n\u251c\u2500\u2500 db1\n\u2502 \u251c\u2500\u2500 cwallet.sso\n\u2502 \u251c\u2500\u2500 ewallet.p12\n\u2502 \u2514\u2500\u2500 ewallet.pem\n\u2514\u2500\u2500 db2\n\u251c\u2500\u2500 cwallet.sso\n\u251c\u2500\u2500 ewallet.p12\n\u2514\u2500\u2500 ewallet.pem\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsxs)(n.li,{children:["Set the ",(0,o.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable where the exporter is running to the directory containing your combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"export TNS_ADMIN=/wallets/combined\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"6",children:["\n",(0,o.jsxs)(n.li,{children:["Finally, update the exporter configuration file to include the TNS aliases for all databases you will be connecting to. Ensure your database configuration file does not use the ",(0,o.jsx)(n.code,{children:"tnsAdmin"})," property, as we are using the global ",(0,o.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable to point to the combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"databases:\n db2:\n username: ****\n password: ****\n url: db2_high\n queryTimeout: 5\n maxOpenConns: 10\n maxIdleConns: 10\n db1:\n username: ****\n password: ****\n url: db1_high\n queryTimeout: 5\n maxOpenConns: 10\n maxIdleConns: 10\n"})}),"\n",(0,o.jsx)(n.p,{children:"Then, run the exporter with the config file:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-shell",children:"./oracledb_exporter --config.file=my-config-file.yaml\n"})})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var a=t(6540);const o={},l=a.createContext(o);function r(e){const n=a.useContext(l);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/d0f03a26.eeaabbaa.js b/docs/assets/js/d0f03a26.eeaabbaa.js new file mode 100644 index 00000000..e8cbf76c --- /dev/null +++ b/docs/assets/js/d0f03a26.eeaabbaa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[7889],{2475:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"advanced/development","title":"Development","description":"The exporter is a Go program using the Prometheus SDK.","source":"@site/versioned_docs/version-2.1.0/advanced/development.md","sourceDirName":"advanced","slug":"/advanced/development","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/development","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/advanced/development.md","tags":[],"version":"2.1.0","sidebarPosition":3,"frontMatter":{"title":"Development","sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Monitoring TxEventQ","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/txeventq"},"next":{"title":"Compatibility with Older Database Versions","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/older-versions"}}');var t=i(4848),o=i(8453);const s={title:"Development",sidebar_position:3},a="Development",c={},l=[{value:"Docker/container build",id:"dockercontainer-build",level:3},{value:"Building Binaries",id:"building-binaries",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"development",children:"Development"})}),"\n",(0,t.jsx)(n.p,{children:"The exporter is a Go program using the Prometheus SDK."}),"\n",(0,t.jsxs)(n.p,{children:["External contributions are welcome, see ",(0,t.jsx)(n.a,{href:"https://github.com/oracle/oracle-db-appdev-monitoring/blob/main/CONTRIBUTING.md",children:"CONTRIBUTING"})," for details."]}),"\n",(0,t.jsx)(n.p,{children:"The exporter initialization is as follows:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Parse flags options and configuration properties"}),"\n",(0,t.jsxs)(n.li,{children:["Load the default toml file (",(0,t.jsx)(n.code,{children:"default-metrics.toml"}),") and store each metric in a ",(0,t.jsx)(n.code,{children:"Metric"})," struct"]}),"\n",(0,t.jsx)(n.li,{children:"Load the custom toml file (if a custom toml file is given)"}),"\n",(0,t.jsxs)(n.li,{children:["Create an ",(0,t.jsx)(n.code,{children:"Exporter"})," object"]}),"\n",(0,t.jsx)(n.li,{children:"Register exporter in prometheus library"}),"\n",(0,t.jsx)(n.li,{children:"Launching a web server to handle incoming requests"}),"\n",(0,t.jsx)(n.li,{children:"Attempt connection to any configured Oracle Database servers"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["These operations are mainly done in the ",(0,t.jsx)(n.code,{children:"main"})," function."]}),"\n",(0,t.jsx)(n.p,{children:"After this initialization phase, the exporter will wait for the arrival of a request."}),"\n",(0,t.jsxs)(n.p,{children:["Each time, it will iterate over the content of the ",(0,t.jsx)(n.code,{children:"metricsToScrape"})," structure (in the function scrape ",(0,t.jsx)(n.code,{children:"func (e * Export) scrape (ch chan <- prometheus.Metric)"}),")."]}),"\n",(0,t.jsxs)(n.p,{children:["For each element (of ",(0,t.jsx)(n.code,{children:"Metric"})," type), a call to the ",(0,t.jsx)(n.code,{children:"ScrapeMetric"})," function will be made which will itself make a call to the ",(0,t.jsx)(n.code,{children:"ScrapeGenericValues"})," function."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"ScrapeGenericValues"})," function will read the information from the ",(0,t.jsx)(n.code,{children:"Metric"})," structure and, depending on the parameters, will generate the metrics to return. In particular, it will use the ",(0,t.jsx)(n.code,{children:"GeneratePrometheusMetrics"})," function which will make SQL calls to the database."]}),"\n",(0,t.jsx)(n.h3,{id:"dockercontainer-build",children:"Docker/container build"}),"\n",(0,t.jsx)(n.p,{children:"To build a container image, run the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"make docker\n"})}),"\n",(0,t.jsx)(n.p,{children:"For ARM:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"make docker-arm\n"})}),"\n",(0,t.jsx)(n.h3,{id:"building-binaries",children:"Building Binaries"}),"\n",(0,t.jsx)(n.p,{children:"Run build:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"make go-build\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This will create binaries and archives inside the ",(0,t.jsx)(n.code,{children:"dist"})," folder for the building operating system."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>a});var r=i(6540);const t={},o=r.createContext(t);function s(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/d647ac8a.6b42a8f3.js b/docs/assets/js/d647ac8a.6b42a8f3.js new file mode 100644 index 00000000..782c20de --- /dev/null +++ b/docs/assets/js/d647ac8a.6b42a8f3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4251],{3260:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"advanced/go-ora","title":"go-ora Driver","description":"The Oracle Database Metrics Exporter experimentally supports compiling with the go-ora database driver. By default, the exporter compiles using the godror database driver, which uses CGO execution to invoke Oracle Instant Client. the go-ora driver presents an option for users who want to use a \\"thin\\" database client without the Oracle Instant Client and CGO.","source":"@site/docs/advanced/go-ora.md","sourceDirName":"advanced","slug":"/advanced/go-ora","permalink":"/oracle-db-appdev-monitoring/docs/next/advanced/go-ora","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/advanced/go-ora.md","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"title":"go-ora Driver","sidebar_position":5},"sidebar":"tutorialSidebar","previous":{"title":"Compatibility with Older Database Versions","permalink":"/oracle-db-appdev-monitoring/docs/next/advanced/older-versions"},"next":{"title":"Releases","permalink":"/oracle-db-appdev-monitoring/docs/next/category/releases"}}');var a=t(4848),n=t(8453);const i={title:"go-ora Driver",sidebar_position:5},s="Using the go-ora database driver",d={},c=[{value:"Configuring go-ora",id:"configuring-go-ora",level:3},{value:"Build with go-ora",id:"build-with-go-ora",level:3}];function l(e){const o={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,n.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.header,{children:(0,a.jsx)(o.h1,{id:"using-the-go-ora-database-driver",children:"Using the go-ora database driver"})}),"\n",(0,a.jsxs)(o.p,{children:["The Oracle Database Metrics Exporter experimentally supports compiling with the ",(0,a.jsx)(o.a,{href:"https://github.com/sijms/go-ora",children:"go-ora database driver"}),". By default, the exporter compiles using the ",(0,a.jsx)(o.code,{children:"godror"}),' database driver, which uses CGO execution to invoke Oracle Instant Client. the go-ora driver presents an option for users who want to use a "thin" database client without the Oracle Instant Client and CGO.']}),"\n",(0,a.jsx)(o.h3,{id:"configuring-go-ora",children:"Configuring go-ora"}),"\n",(0,a.jsxs)(o.p,{children:["Because go-ora does not use Oracle Instant Client, it is recommended to provide all connection string options in the ",(0,a.jsx)(o.code,{children:"database.url"})," property:"]}),"\n",(0,a.jsx)(o.pre,{children:(0,a.jsx)(o.code,{className:"language-yaml",children:"databases:\n go_ora_db:\n username: myuser\n password: ******\n url: my_tnsname?wallet=/path/to/wallet&ssl=1\n"})}),"\n",(0,a.jsx)(o.h3,{id:"build-with-go-ora",children:"Build with go-ora"}),"\n",(0,a.jsxs)(o.p,{children:["To build using ",(0,a.jsx)(o.code,{children:"go-ora"})," instead of ",(0,a.jsx)(o.code,{children:"godror"}),", set ",(0,a.jsx)(o.code,{children:"TAGS=goora CGO_ENABLED=0"}),":"]}),"\n",(0,a.jsx)(o.pre,{children:(0,a.jsx)(o.code,{className:"language-bash",children:"make go-build TAGS=goora CGO_ENABLED=0\n"})})]})}function h(e={}){const{wrapper:o}={...(0,n.R)(),...e.components};return o?(0,a.jsx)(o,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},8453:(e,o,t)=>{t.d(o,{R:()=>i,x:()=>s});var r=t(6540);const a={},n=r.createContext(a);function i(e){const o=r.useContext(n);return r.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function s(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),r.createElement(n.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/d94a41cc.3e757db4.js b/docs/assets/js/d94a41cc.da36838b.js similarity index 61% rename from docs/assets/js/d94a41cc.3e757db4.js rename to docs/assets/js/d94a41cc.da36838b.js index 0619a1c6..717d8181 100644 --- a/docs/assets/js/d94a41cc.3e757db4.js +++ b/docs/assets/js/d94a41cc.da36838b.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4580],{6358:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"configuration/config-file","title":"Exporter Configuration","description":"The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.","source":"@site/docs/configuration/config-file.md","sourceDirName":"configuration","slug":"/configuration/config-file","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/config-file","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/configuration/config-file.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Exporter Configuration","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Configuration","permalink":"/oracle-db-appdev-monitoring/docs/next/category/configuration"},"next":{"title":"Custom Metrics","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/custom-metrics"}}');var a=t(4848),i=t(8453);const r={title:"Exporter Configuration",sidebar_position:1},s="Exporter Configuration",c={},l=[{value:"Scrape on request vs. Scrape on interval",id:"scrape-on-request-vs-scrape-on-interval",level:3},{value:"Config file in a container image",id:"config-file-in-a-container-image",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"exporter-configuration",children:"Exporter Configuration"})}),"\n",(0,a.jsxs)(n.p,{children:["The recommended way to configure the exporter is with the ",(0,a.jsx)(n.code,{children:"--config.file"})," argument, specifying a YAML configuration file."]}),"\n",(0,a.jsx)(n.p,{children:"The configuration file contains the following options:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n# If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,\n# \"$test$pwd\" => \"$$test$$pwd\"\n# Otherwise, the value will be expanded as an environment variable.\n\n# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n ## Database connection information for the \"default\" database.\n default:\n ## Database username\n username: ${DB_USERNAME}\n ## Database password\n password: ${DB_PASSWORD}\n ## Database password file\n ## If specified, will load the database password from a file.\n # passwordFile: ${DB_PASSWORD_FILE}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ## Arbitrary labels to add to each metric scraped from this database\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\nmetrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files\n custom:\n - custom-metrics-example/custom-metrics.toml\n\nlog:\n # Path of log file\n destination: /opt/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n\n# Optionally configure prometheus webserver\n#web:\n# listenAddresses: [':9161']\n# systemdSocket: true|false\n# configFile: /path/to/webconfigfile\n"})}),"\n",(0,a.jsx)(n.h3,{id:"scrape-on-request-vs-scrape-on-interval",children:"Scrape on request vs. Scrape on interval"}),"\n",(0,a.jsxs)(n.p,{children:["The metrics exporter has two scraping modes: scrape on request, and scrape on interval. By default, the metrics exporter scrapes metrics on request, when the ",(0,a.jsx)(n.code,{children:"/metrics"})," endpoint is invoked."]}),"\n",(0,a.jsxs)(n.p,{children:["To scrape metrics on a given interval, set the ",(0,a.jsx)(n.code,{children:"metrics.scrapeInterval"})," property to a valid interval:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"metrics:\n # Metrics will be scraped every 30s.\n scrapeInterval: 30s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["An individual metric may have its own scrape interval separate from the exporter's scrape interval. See the ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/custom-metrics#metric-schema",children:"metric schema"})," for details on configuring per-metric scrape intervals."]}),"\n",(0,a.jsx)(n.h3,{id:"config-file-in-a-container-image",children:"Config file in a container image"}),"\n",(0,a.jsx)(n.p,{children:"To add your custom config file to a container image, you can layer the base exporter image and include that config:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-Dockerfile",children:'FROM container-registry.oracle.com/database/observability-exporter:2.1.0\nCOPY my-exporter-config.yaml /\nENTRYPOINT ["/oracledb_exporter", "--config.file", "/my-exporter-config.yaml"]\n'})})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var o=t(6540);const a={},i=o.createContext(a);function r(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[4580],{6358:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"configuration/config-file","title":"Exporter Configuration","description":"The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.","source":"@site/docs/configuration/config-file.md","sourceDirName":"configuration","slug":"/configuration/config-file","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/config-file","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/docs/configuration/config-file.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"title":"Exporter Configuration","sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Configuration","permalink":"/oracle-db-appdev-monitoring/docs/next/category/configuration"},"next":{"title":"Custom Metrics","permalink":"/oracle-db-appdev-monitoring/docs/next/configuration/custom-metrics"}}');var a=o(4848),i=o(8453);const r={title:"Exporter Configuration",sidebar_position:1},s="Exporter Configuration",c={},l=[{value:"Scrape on request vs. Scrape on interval",id:"scrape-on-request-vs-scrape-on-interval",level:3},{value:"Config file in a container image",id:"config-file-in-a-container-image",level:3}];function d(e){const n={a:"a",code:"code",h1:"h1",h3:"h3",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"exporter-configuration",children:"Exporter Configuration"})}),"\n",(0,a.jsxs)(n.p,{children:["The recommended way to configure the exporter is with the ",(0,a.jsx)(n.code,{children:"--config.file"})," argument, specifying a YAML configuration file."]}),"\n",(0,a.jsx)(n.p,{children:"The configuration file contains the following options:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n# If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,\n# \"$test$pwd\" => \"$$test$$pwd\"\n# Otherwise, the value will be expanded as an environment variable.\n\n# Example Oracle Database Metrics Exporter Configuration file.\n# Environment variables of the form ${VAR_NAME} will be expanded.\n\ndatabases:\n ## Path on which metrics will be served\n # metricsPath: /metrics\n ## Database connection information for the \"default\" database.\n default:\n ## Database username\n username: ${DB_USERNAME}\n ## Database password\n password: ${DB_PASSWORD}\n ## Database password file\n ## If specified, will load the database password from a file.\n # passwordFile: ${DB_PASSWORD_FILE}\n ## Database connection url\n url: localhost:1521/freepdb1\n\n ## Metrics query timeout for this database, in seconds\n queryTimeout: 5\n\n ## Rely on Oracle Database External Authentication by network or OS\n # externalAuth: false\n ## Database role\n # role: SYSDBA\n ## Path to Oracle Database wallet, if using wallet\n # tnsAdmin: /path/to/database/wallet\n\n ### Connection settings:\n ### Either the go-sql or Oracle Database connection pool may be used.\n ### To use the Oracle Database connection pool over the go-sql connection pool,\n ### set maxIdleConns to zero and configure the pool* settings.\n\n ### Connection pooling settings for the go-sql connection pool\n ## Max open connections for this database using go-sql connection pool\n maxOpenConns: 10\n ## Max idle connections for this database using go-sql connection pool\n maxIdleConns: 10\n\n ### Connection pooling settings for the Oracle Database connection pool\n ## Oracle Database connection pool increment.\n # poolIncrement: 1\n ## Oracle Database Connection pool maximum size\n # poolMaxConnections: 15\n ## Oracle Database Connection pool minimum size\n # poolMinConnections: 15\n\n ## Arbitrary labels to add to each metric scraped from this database\n # labels:\n # label_name1: label_value1\n # label_name2: label_value2\n\nmetrics:\n ## How often to scrape metrics. If not provided, metrics will be scraped on request.\n # scrapeInterval: 15s\n ## Path to default metrics file.\n default: default-metrics.toml\n ## Paths to any custom metrics files\n custom:\n - custom-metrics-example/custom-metrics.toml\n\nlog:\n # Path of log file\n destination: /opt/alert.log\n # Interval of log updates\n interval: 15s\n ## Set disable to 1 to disable logging\n # disable: 0\n\n# Optionally configure prometheus webserver\n#web:\n# listenAddresses: [':9161']\n# systemdSocket: true|false\n# configFile: /path/to/webconfigfile\n"})}),"\n",(0,a.jsxs)(n.p,{children:["From the exporter configuration file, you may optionally load database credentials from ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/oci-vault",children:"OCI Vault"}),", ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/azure-vault",children:"Azure Vault"}),", or ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/hashicorp-vault",children:"HashiCorp Vault"}),".."]}),"\n",(0,a.jsx)(n.h3,{id:"scrape-on-request-vs-scrape-on-interval",children:"Scrape on request vs. Scrape on interval"}),"\n",(0,a.jsxs)(n.p,{children:["The metrics exporter has two scraping modes: scrape on request, and scrape on interval. By default, the metrics exporter scrapes metrics on request, when the ",(0,a.jsx)(n.code,{children:"/metrics"})," endpoint is invoked."]}),"\n",(0,a.jsxs)(n.p,{children:["To scrape metrics on a given interval, set the ",(0,a.jsx)(n.code,{children:"metrics.scrapeInterval"})," property to a valid interval:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"metrics:\n # Metrics will be scraped every 30s.\n scrapeInterval: 30s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["An individual metric may have its own scrape interval separate from the exporter's scrape interval. See the ",(0,a.jsx)(n.a,{href:"/oracle-db-appdev-monitoring/docs/next/configuration/custom-metrics#metric-schema",children:"metric schema"})," for details on configuring per-metric scrape intervals."]}),"\n",(0,a.jsx)(n.h3,{id:"config-file-in-a-container-image",children:"Config file in a container image"}),"\n",(0,a.jsx)(n.p,{children:"To add your custom config file to a container image, you can layer the base exporter image and include that config:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-Dockerfile",children:'FROM container-registry.oracle.com/database/observability-exporter:2.2.0\nCOPY my-exporter-config.yaml /\nENTRYPOINT ["/oracledb_exporter", "--config.file", "/my-exporter-config.yaml"]\n'})})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>s});var t=o(6540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/eb867a72.474b79be.js b/docs/assets/js/eb867a72.474b79be.js deleted file mode 100644 index 265531a3..00000000 --- a/docs/assets/js/eb867a72.474b79be.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3255],{8387:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"advanced/older-versions","title":"Compatibility with Older Database Versions","description":"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.","source":"@site/versioned_docs/version-2.1.0/advanced/older-versions.md","sourceDirName":"advanced","slug":"/advanced/older-versions","permalink":"/oracle-db-appdev-monitoring/docs/advanced/older-versions","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/advanced/older-versions.md","tags":[],"version":"2.1.0","sidebarPosition":4,"frontMatter":{"title":"Compatibility with Older Database Versions","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Development","permalink":"/oracle-db-appdev-monitoring/docs/advanced/development"},"next":{"title":"Releases","permalink":"/oracle-db-appdev-monitoring/docs/category/releases"}}');var n=t(4848),a=t(8453);const r={title:"Compatibility with Older Database Versions",sidebar_position:4},o="Older Database Versions",d={},l=[{value:"Known Issues with Older Database Versions",id:"known-issues-with-older-database-versions",level:3},{value:"Disabling incompatible metrics",id:"disabling-incompatible-metrics",level:2}];function c(e){const s={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"older-database-versions",children:"Older Database Versions"})}),"\n",(0,n.jsx)(s.p,{children:"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database."}),"\n",(0,n.jsx)(s.h3,{id:"known-issues-with-older-database-versions",children:"Known Issues with Older Database Versions"}),"\n",(0,n.jsx)(s.p,{children:"If you are running an unsupported version of Oracle Database, you may encounter the following issues:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Metrics using modern SQL syntax may not work. For compatibility, you can disable or modify these metrics."}),"\n",(0,n.jsx)(s.li,{children:'The exporter uses a "thick" database client. Ensure your database client libraries are compatible with your database version.'}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"disabling-incompatible-metrics",children:"Disabling incompatible metrics"}),"\n",(0,n.jsx)(s.p,{children:"To disable an incompatible metric, either remove that metric from the metrics file or configure the metric so it does not apply the affected database:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-toml",children:"[[metric]]\ncontext = \"process\"\nlabels = [ \"inst_id\" ]\nmetricsdesc = { count=\"Gauge metric with count of processes.\" }\nrequest = '''\nselect inst_id, count(*) as count\nfrom gv$process\ngroup by inst_id\n'''\n# Set databases to an empty array to disable the metric entirely,\n# or include only compatible databases in this array.\ndatabases = []\n"})})]})}function p(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>o});var i=t(6540);const n={},a=i.createContext(n);function r(e){const s=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/eb867a72.a243e6f1.js b/docs/assets/js/eb867a72.a243e6f1.js new file mode 100644 index 00000000..1e9d5df5 --- /dev/null +++ b/docs/assets/js/eb867a72.a243e6f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[3255],{8387:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>r,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"advanced/older-versions","title":"Compatibility with Older Database Versions","description":"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.","source":"@site/versioned_docs/version-2.1.0/advanced/older-versions.md","sourceDirName":"advanced","slug":"/advanced/older-versions","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/older-versions","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/advanced/older-versions.md","tags":[],"version":"2.1.0","sidebarPosition":4,"frontMatter":{"title":"Compatibility with Older Database Versions","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Development","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/advanced/development"},"next":{"title":"Releases","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/category/releases"}}');var n=t(4848),a=t(8453);const r={title:"Compatibility with Older Database Versions",sidebar_position:4},o="Older Database Versions",d={},l=[{value:"Known Issues with Older Database Versions",id:"known-issues-with-older-database-versions",level:3},{value:"Disabling incompatible metrics",id:"disabling-incompatible-metrics",level:2}];function c(e){const s={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"older-database-versions",children:"Older Database Versions"})}),"\n",(0,n.jsx)(s.p,{children:"In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database."}),"\n",(0,n.jsx)(s.h3,{id:"known-issues-with-older-database-versions",children:"Known Issues with Older Database Versions"}),"\n",(0,n.jsx)(s.p,{children:"If you are running an unsupported version of Oracle Database, you may encounter the following issues:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Metrics using modern SQL syntax may not work. For compatibility, you can disable or modify these metrics."}),"\n",(0,n.jsx)(s.li,{children:'The exporter uses a "thick" database client. Ensure your database client libraries are compatible with your database version.'}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"disabling-incompatible-metrics",children:"Disabling incompatible metrics"}),"\n",(0,n.jsx)(s.p,{children:"To disable an incompatible metric, either remove that metric from the metrics file or configure the metric so it does not apply the affected database:"}),"\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-toml",children:"[[metric]]\ncontext = \"process\"\nlabels = [ \"inst_id\" ]\nmetricsdesc = { count=\"Gauge metric with count of processes.\" }\nrequest = '''\nselect inst_id, count(*) as count\nfrom gv$process\ngroup by inst_id\n'''\n# Set databases to an empty array to disable the metric entirely,\n# or include only compatible databases in this array.\ndatabases = []\n"})})]})}function p(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>o});var i=t(6540);const n={},a=i.createContext(n);function r(e){const s=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/f36aa3f3.c7a14805.js b/docs/assets/js/f36aa3f3.1fa63be0.js similarity index 61% rename from docs/assets/js/f36aa3f3.c7a14805.js rename to docs/assets/js/f36aa3f3.1fa63be0.js index ac0c9f1b..84230a8f 100644 --- a/docs/assets/js/f36aa3f3.c7a14805.js +++ b/docs/assets/js/f36aa3f3.1fa63be0.js @@ -1 +1 @@ -"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[5808],{943:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Releases","description":"Information on the exporter releases, changelog, and roadmap.","slug":"/category/releases","permalink":"/oracle-db-appdev-monitoring/docs/next/category/releases","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Compatibility with Older Database Versions","permalink":"/oracle-db-appdev-monitoring/docs/next/advanced/older-versions"},"next":{"title":"Roadmap","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/roadmap"}}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[5808],{943:e=>{e.exports=JSON.parse('{"categoryGeneratedIndex":{"title":"Releases","description":"Information on the exporter releases, changelog, and roadmap.","slug":"/category/releases","permalink":"/oracle-db-appdev-monitoring/docs/next/category/releases","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"go-ora Driver","permalink":"/oracle-db-appdev-monitoring/docs/next/advanced/go-ora"},"next":{"title":"Roadmap","permalink":"/oracle-db-appdev-monitoring/docs/next/releases/roadmap"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/ff66e47b.d2f97405.js b/docs/assets/js/ff66e47b.d2f97405.js new file mode 100644 index 00000000..0126e67f --- /dev/null +++ b/docs/assets/js/ff66e47b.d2f97405.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksite=self.webpackChunksite||[]).push([[5051],{7397:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"configuration/oracle-wallet","title":"Oracle Wallet (mTLS)","description":"For mutual TLS (mTLS) connections, you must use an Oracle Wallet.","source":"@site/versioned_docs/version-2.1.0/configuration/oracle-wallet.md","sourceDirName":"configuration","slug":"/configuration/oracle-wallet","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oracle-wallet","draft":false,"unlisted":false,"editUrl":"https://github.com/oracle/oracle-db-appdev-monitoring/tree/main/site/versioned_docs/version-2.1.0/configuration/oracle-wallet.md","tags":[],"version":"2.1.0","sidebarPosition":4,"frontMatter":{"title":"Oracle Wallet (mTLS)","sidebar_position":4},"sidebar":"tutorialSidebar","previous":{"title":"Multiple Databases","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/multiple-databases"},"next":{"title":"Alert Logs","permalink":"/oracle-db-appdev-monitoring/docs/2.1.0/configuration/alert-logs"}}');var o=t(4848),l=t(8453);const r={title:"Oracle Wallet (mTLS)",sidebar_position:4},s="Using a Wallet",i={},c=[{value:"mTLS for multiple databases with Oracle Wallet",id:"mtls-for-multiple-databases-with-oracle-wallet",level:3}];function d(e){const n={code:"code",h1:"h1",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"using-a-wallet",children:"Using a Wallet"})}),"\n",(0,o.jsx)(n.p,{children:"For mutual TLS (mTLS) connections, you must use an Oracle Wallet."}),"\n",(0,o.jsx)(n.p,{children:"If you are using Oracle Autonomous Database with mTLS, for example, you can download and unzip the wallet from the Oracle Cloud Infrastructure (OCI) console."}),"\n",(0,o.jsx)(n.p,{children:"To configure the exporter to use an Oracle Wallet,"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["Set the ",(0,o.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable to the directory containing the unzipped wallet"]}),"\n",(0,o.jsx)(n.li,{children:"Configure your database instance with the appropriate database TNS name:"}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"databases:\n mydb:\n username: admin\n password: \n # TNS Name from wallet tnsnames.ora file, e.g., mydb_high\n url: \n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you are running the exporter as a container, you can mount the wallet as a volume. For example, mounting the ",(0,o.jsx)(n.code,{children:"./wallet"})," directory to the ",(0,o.jsx)(n.code,{children:"/wallet"})," location:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"docker run -it --rm \\\n -e DB_USERNAME=pdbadmin \\\n -e DB_PASSWORD=Welcome12345 \\\n -e DB_CONNECT_STRING=devdb_tp \\\n -v ./wallet:/wallet \\\n -p 9161:9161 \\\n container-registry.oracle.com/database/observability-exporter:2.1.0\n"})}),"\n",(0,o.jsx)(n.h3,{id:"mtls-for-multiple-databases-with-oracle-wallet",children:"mTLS for multiple databases with Oracle Wallet"}),"\n",(0,o.jsxs)(n.p,{children:["The Oracle Database Metrics exporter uses ODPI-C, which can only initalize the TNS aliases from a ",(0,o.jsx)(n.code,{children:"tnsnames.ora"}),' file once per process. To work around this, the exporter can be configured to read from a "combined" ',(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file containing all TNS aliases for connections in a multi-database configuration."]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"For each database the exporter will connect to, download the corresponding wallet files. If you're using ADB/ATP-S, download the regional wallet instead of the instance wallet if the databases are in the same region."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Copy the TNS aliases the ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file from each wallet, and combine them into one file, so all your database service names are in one file together"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["In the combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file, and add the following snippet to each TNS alias connection string, to tell the client where the wallet directory is:"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"(security=(MY_WALLET_DIRECTORY=/path/to/this/database/wallet))\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file, which contains the TNS aliases for both databases, and their corresponding wallet location in the ",(0,o.jsx)(n.code,{children:"security"})," configuration will look something like the following:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-sql",children:"db1_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db1)(ssl_server_dn_match=yes)))\n\ndb2_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db2)(ssl_server_dn_match=yes)))\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"4",children:["\n",(0,o.jsxs)(n.li,{children:["Take wallet files (cwallet.sso, ewallet.p12, & ewallet.pem) for each database, and place them in separate directories. For example, ",(0,o.jsx)(n.code,{children:"db1"})," gets its own directory, ",(0,o.jsx)(n.code,{children:"db2"})," gets its own directory, and so forth."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["The resulting directory structure should look like the following, with wallet information separate from the combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"wallets\n\u251c\u2500\u2500 combined\n\u2502 \u251c\u2500\u2500 sqlnet.ora\n\u2502 \u2514\u2500\u2500 tnsnames.ora // Combined tnsnames.ora\n\u251c\u2500\u2500 db1\n\u2502 \u251c\u2500\u2500 cwallet.sso\n\u2502 \u251c\u2500\u2500 ewallet.p12\n\u2502 \u2514\u2500\u2500 ewallet.pem\n\u2514\u2500\u2500 db2\n\u251c\u2500\u2500 cwallet.sso\n\u251c\u2500\u2500 ewallet.p12\n\u2514\u2500\u2500 ewallet.pem\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"5",children:["\n",(0,o.jsxs)(n.li,{children:["Set the ",(0,o.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable where the exporter is running to the directory containing your combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"export TNS_ADMIN=/wallets/combined\n"})}),"\n",(0,o.jsxs)(n.ol,{start:"6",children:["\n",(0,o.jsxs)(n.li,{children:["Finally, update the exporter configuration file to include the TNS aliases for all databases you will be connecting to. Ensure your database configuration file does not use the ",(0,o.jsx)(n.code,{children:"tnsAdmin"})," property, as we are using the global ",(0,o.jsx)(n.code,{children:"TNS_ADMIN"})," environment variable to point to the combined ",(0,o.jsx)(n.code,{children:"tnsnames.ora"})," file:"]}),"\n"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"databases:\n db2:\n username: ****\n password: ****\n url: db2_high\n queryTimeout: 5\n maxOpenConns: 10\n maxIdleConns: 10\n db1:\n username: ****\n password: ****\n url: db1_high\n queryTimeout: 5\n maxOpenConns: 10\n maxIdleConns: 10\n"})}),"\n",(0,o.jsx)(n.p,{children:"Then, run the exporter with the config file:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-shell",children:"./oracledb_exporter --config.file=my-config-file.yaml\n"})})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var a=t(6540);const o={},l=a.createContext(o);function r(e){const n=a.useContext(l);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),a.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/main.bd797f4b.js b/docs/assets/js/main.910e7da0.js similarity index 62% rename from docs/assets/js/main.bd797f4b.js rename to docs/assets/js/main.910e7da0.js index 320a3001..8e99c9cb 100644 --- a/docs/assets/js/main.bd797f4b.js +++ b/docs/assets/js/main.910e7da0.js @@ -1,2 +1,2 @@ -/*! For license information please see main.bd797f4b.js.LICENSE.txt */ -(self.webpackChunksite=self.webpackChunksite||[]).push([[8792],{115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var l,s,c,u;if(Array.isArray(e)){if((l=e.length)!=i.length)return!1;for(s=l;0!==s--;)if(!a(e[s],i[s]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;for(u=e.entries();!(s=u.next()).done;)if(!a(s.value[1],i.get(s.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!i.has(s.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((l=e.length)!=i.length)return!1;for(s=l;0!==s--;)if(e[s]!==i[s])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((l=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(s=l;0!==s--;)if(!Object.prototype.hasOwnProperty.call(i,c[s]))return!1;if(t&&e instanceof Element)return!1;for(s=l;0!==s--;)if(("_owner"!==c[s]&&"__v"!==c[s]&&"__o"!==c[s]||!e.$$typeof)&&!a(e[c[s]],i[c[s]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},119:(e,t,n)=>{"use strict";n.r(t)},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},311:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,l],u=0;(s=new Error(t.replace(/%s/g,function(){return c[u++]}))).name="Invariant Violation"}throw s.framesToPop=1,s}}},418:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=()=>null},440:(e,t,n)=>{"use strict";t.rA=t.Ks=void 0;const r=n(1635);var o=n(2983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(2566);var i=n(253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>G});var r=n(6540),o=n(5556),a=n.n(o),i=n(115),l=n.n(i),s=n(311),c=n.n(s),u=n(2833),d=n.n(u);function p(){return p=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}var h={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},v={type:["application/ld+json"]},y={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(h).map(function(e){return h[e]}),k={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},x=Object.keys(k).reduce(function(e,t){return e[k[t]]=t,e},{}),S=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},_=function(e){var t=S(e,h.TITLE),n=S(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,function(){return t});var r=S(e,"defaultTitle");return t||r||void 0},E=function(e){return S(e,"onChangeClientState")||function(){}},C=function(e,t){return t.filter(function(t){return void 0!==t[e]}).map(function(t){return t[e]}).reduce(function(e,t){return p({},e,t)},{})},A=function(e,t){return t.filter(function(e){return void 0!==e[h.BASE]}).map(function(e){return e[h.BASE]}).reverse().reduce(function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o/g,">").replace(/"/g,""").replace(/'/g,"'")},D=function(e){return Object.keys(e).reduce(function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r},"")},I=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce(function(t,n){return t[k[n]||n]=e[n],t},t)},F=function(e,t){return t.map(function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach(function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]}),r.createElement(e,a)})},M=function(e,t,n){switch(e){case h.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=I(n,o),[r.createElement(h.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=D(n),a=P(t);return o?"<"+e+' data-rh="true" '+o+">"+R(a,r)+"":"<"+e+' data-rh="true">'+R(a,r)+""}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return I(t)},toString:function(){return D(t)}};default:return{toComponent:function(){return F(e,t)},toString:function(){return function(e,t,n){return t.reduce(function(t,r){var o=Object.keys(r).filter(function(e){return!("innerHTML"===e||"cssText"===e)}).reduce(function(e,t){var o=void 0===r[t]?t:t+'="'+R(r[t],n)+'"';return e?e+" "+o:o},""),a=r.innerHTML||r.cssText||"",i=-1===O.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+"")},"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,i=e.styleTags,l=e.title,s=void 0===l?"":l,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var m=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=N(e.metaTags,y),a=N(t,b),i=N(n,v);return{priorityMethods:{toComponent:function(){return[].concat(F(h.META,o.priority),F(h.LINK,a.priority),F(h.SCRIPT,i.priority))},toString:function(){return M(h.META,o.priority,r)+" "+M(h.LINK,a.priority,r)+" "+M(h.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);f=m.priorityMethods,u=m.linkTags,d=m.metaTags,p=m.scriptTags}return{priority:f,base:M(h.BASE,t,r),bodyAttributes:M("bodyAttributes",n,r),htmlAttributes:M("htmlAttributes",o,r),link:M(h.LINK,u,r),meta:M(h.META,d,r),noscript:M(h.NOSCRIPT,a,r),script:M(h.SCRIPT,p,r),style:M(h.STYLE,i,r),title:M(h.TITLE,{title:s,titleAttributes:c},r)}},B=[],$=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?B:n.instances},add:function(e){(n.canUseDOM?B:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?B:n.instances).indexOf(e);(n.canUseDOM?B:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=z({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},U=r.createContext({}),q=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),H="undefined"!=typeof document,G=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new $(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);G.canUseDOM=H,G.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},G.defaultProps={context:{}},G.displayName="HelmetProvider";var V=function(e,t){var n,r=document.head||document.querySelector(h.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach(function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some(function(e,t){return n=t,r.isEqualNode(e)})?a.splice(n,1):i.push(r)}),a.forEach(function(e){return e.parentNode.removeChild(e)}),i.forEach(function(e){return r.appendChild(e)}),{oldTags:a,newTags:i}},W=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),l=0;l=0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},Q=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,l=e.onChangeClientState,s=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;W(h.BODY,e.bodyAttributes),W(h.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=P(e)),W(h.TITLE,t)}(u,d);var p={baseTag:V(h.BASE,n),linkTags:V(h.LINK,o),metaTags:V(h.META,a),noscriptTags:V(h.NOSCRIPT,i),scriptTags:V(h.SCRIPT,s),styleTags:V(h.STYLE,c)},f={},m={};Object.keys(p).forEach(function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(m[e]=p[e].oldTags)}),t&&t(),l(e,f,m)},K=null,Y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return p({},r,((t={})[n.type]=[].concat(r[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case h.TITLE:return p({},o,((t={})[r.type]=i,t.titleAttributes=p({},a),t));case h.BODY:return p({},o,{bodyAttributes:p({},a)});case h.HTML:return p({},o,{htmlAttributes:p({},a)});default:return p({},o,((n={})[r.type]=p({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach(function(t){var r;n=p({},n,((r={})[t]=e[t],r))}),n},n.warnOnInvalidChildren=function(e,t){return c()(w.some(function(t){return e.type===t}),"function"==typeof e.type?"You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some(function(e){return"string"!=typeof e}),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``} ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,function(e){if(e&&e.props){var r=e.props,a=r.children,i=g(r,X),l=Object.keys(i).reduce(function(e,t){return e[x[t]||t]=i[t],e},{}),s=e.type;switch("symbol"==typeof s?s=s.toString():n.warnOnInvalidChildren(e,a),s){case h.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case h.LINK:case h.META:case h.NOSCRIPT:case h.SCRIPT:case h.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:l,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:l,nestedChildren:a})}}}),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=g(e,Z),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof $||(a=new $(a.context,a.instances)),a?r.createElement(Y,p({},o,{context:a.value,helmetData:void 0})):r.createElement(U.Consumer,null,function(e){return r.createElement(Y,p({},o,{context:e}))})},t}(r.Component);J.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},609:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>c});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s({children:e,name:t,items:n}){const o=(0,r.useMemo)(()=>t&&n?{name:t,items:n}:null,[t,n]);return(0,a.jsx)(l.Provider,{value:o,children:e})}function c(){const e=(0,r.useContext)(l);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>c});n(6540);const r=JSON.parse('{"N":"localStorage","M":""}'),o=r.N;function a({key:e,oldValue:t,newValue:n,storage:r}){if(t===n)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,e,t,n,window.location.href,r),window.dispatchEvent(o)}function i(e=o){if("undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){const n=`${e}${r.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const o=i(t?.persistence);return null===o?s:{get:()=>{try{return o.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=o.getItem(n);o.setItem(n,e),a({key:n,oldValue:t,newValue:e,storage:o})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=o.getItem(n);o.removeItem(n),a({key:n,oldValue:e,newValue:null,storage:o})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===o&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},961:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(6221)},1043:(e,t,n)=>{"use strict";n.r(t)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4164),o=n(1312),a=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u({as:e,id:t,...n}){const u=(0,l.A)(),{navbar:{hideOnScroll:d}}=(0,a.p)();if("h1"===e||!t)return(0,c.jsx)(e,{...n,id:void 0});u.collectAnchor(t);const p=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof n.children?n.children:t});return(0,c.jsxs)(e,{...n,className:(0,r.A)("anchor",d?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,n.className),id:t,children:[n.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${t}`,"aria-label":p,title:p,children:"\u200b"})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(4164),a=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function c({className:e,children:t}){const n=(0,a.A)(),{colorMode:c}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(n?"dark"===c?["dark"]:["light"]:["light","dark"]).map(n=>{const a=t({theme:n,className:(0,o.A)(e,l.themedComponent,l[`themedComponent--${n}`])});return(0,s.jsx)(r.Fragment,{children:a},n)})})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,s.jsx)(c,{className:n,children:({theme:e,className:n})=>(0,s.jsx)("img",{src:t[e],alt:r,className:n,...o})})}},1247:(e,t,n)=>{"use strict";var r=n(9982),o=n(6540),a=n(961);function i(e){var t="https://react.dev/errors/"+e;if(1M||(e.current=F[M],F[M]=null,M--)}function $(e,t){M++,F[M]=e.current,e.current=t}var U=z(null),q=z(null),H=z(null),G=z(null);function V(e,t){switch($(H,t),$(q,e),$(U,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?od(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)e=ad(t=od(t),e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}B(U),$(U,e)}function W(){B(U),B(q),B(H)}function Q(e){null!==e.memoizedState&&$(G,e);var t=U.current,n=ad(t,e.type);t!==n&&($(q,e),$(U,n))}function K(e){q.current===e&&(B(U),B(q)),G.current===e&&(B(G),Qd._currentValue=I)}var Y=Object.prototype.hasOwnProperty,X=r.unstable_scheduleCallback,Z=r.unstable_cancelCallback,J=r.unstable_shouldYield,ee=r.unstable_requestPaint,te=r.unstable_now,ne=r.unstable_getCurrentPriorityLevel,re=r.unstable_ImmediatePriority,oe=r.unstable_UserBlockingPriority,ae=r.unstable_NormalPriority,ie=r.unstable_LowPriority,le=r.unstable_IdlePriority,se=r.log,ce=r.unstable_setDisableYieldValue,ue=null,de=null;function pe(e){if("function"==typeof se&&ce(e),de&&"function"==typeof de.setStrictMode)try{de.setStrictMode(ue,e)}catch(t){}}var fe=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(me(e)/ge|0)|0},me=Math.log,ge=Math.LN2;var he=256,be=4194304;function ve(e){var t=42&e;if(0!==t)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194048&e;case 4194304:case 8388608:case 16777216:case 33554432:return 62914560&e;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ye(e,t,n){var r=e.pendingLanes;if(0===r)return 0;var o=0,a=e.suspendedLanes,i=e.pingedLanes;e=e.warmLanes;var l=134217727&r;return 0!==l?0!==(r=l&~a)?o=ve(r):0!==(i&=l)?o=ve(i):n||0!==(n=l&~e)&&(o=ve(n)):0!==(l=r&~a)?o=ve(l):0!==i?o=ve(i):n||0!==(n=r&~e)&&(o=ve(n)),0===o?0:0!==t&&t!==o&&0===(t&a)&&((a=o&-o)>=(n=t&-t)||32===a&&4194048&n)?t:o}function we(e,t){return 0===(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)}function ke(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function xe(){var e=he;return!(4194048&(he<<=1))&&(he=256),e}function Se(){var e=be;return!(62914560&(be<<=1))&&(be=4194304),e}function _e(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ee(e,t){e.pendingLanes|=t,268435456!==t&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Ce(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-fe(t);e.entangledLanes|=t,e.entanglements[r]=1073741824|e.entanglements[r]|4194090&n}function Ae(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-fe(n),o=1<)":-1--o||s[r]!==c[o]){var u="\n"+s[r].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}}while(1<=r&&0<=o);break}}}finally{at=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?ot(n):""}function lt(e){switch(e.tag){case 26:case 27:case 5:return ot(e.type);case 16:return ot("Lazy");case 13:return ot("Suspense");case 19:return ot("SuspenseList");case 0:case 15:return it(e.type,!1);case 11:return it(e.type.render,!1);case 1:return it(e.type,!0);case 31:return ot("Activity");default:return""}}function st(e){try{var t="";do{t+=lt(e),e=e.return}while(e);return t}catch(n){return"\nError generating stack: "+n.message+"\n"+n.stack}}function ct(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function ut(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function dt(e){e._valueTracker||(e._valueTracker=function(e){var t=ut(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function pt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=ut(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function ft(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}var mt=/[\n"\\]/g;function gt(e){return e.replace(mt,function(e){return"\\"+e.charCodeAt(0).toString(16)+" "})}function ht(e,t,n,r,o,a,i,l){e.name="",null!=i&&"function"!=typeof i&&"symbol"!=typeof i&&"boolean"!=typeof i?e.type=i:e.removeAttribute("type"),null!=t?"number"===i?(0===t&&""===e.value||e.value!=t)&&(e.value=""+ct(t)):e.value!==""+ct(t)&&(e.value=""+ct(t)):"submit"!==i&&"reset"!==i||e.removeAttribute("value"),null!=t?vt(e,i,ct(t)):null!=n?vt(e,i,ct(n)):null!=r&&e.removeAttribute("value"),null==o&&null!=a&&(e.defaultChecked=!!a),null!=o&&(e.checked=o&&"function"!=typeof o&&"symbol"!=typeof o),null!=l&&"function"!=typeof l&&"symbol"!=typeof l&&"boolean"!=typeof l?e.name=""+ct(l):e.removeAttribute("name")}function bt(e,t,n,r,o,a,i,l){if(null!=a&&"function"!=typeof a&&"symbol"!=typeof a&&"boolean"!=typeof a&&(e.type=a),null!=t||null!=n){if(("submit"===a||"reset"===a)&&null==t)return;n=null!=n?""+ct(n):"",t=null!=t?""+ct(t):n,l||t===e.value||(e.value=t),e.defaultValue=t}r="function"!=typeof(r=null!=r?r:o)&&"symbol"!=typeof r&&!!r,e.checked=l?e.checked:!!r,e.defaultChecked=!!r,null!=i&&"function"!=typeof i&&"symbol"!=typeof i&&"boolean"!=typeof i&&(e.name=i)}function vt(e,t,n){"number"===t&&ft(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function yt(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o=Sn),Cn=String.fromCharCode(32),An=!1;function Tn(e,t){switch(e){case"keyup":return-1!==kn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function jn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Pn=!1;var Nn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Ln(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Nn[e.type]:"textarea"===t}function On(e,t,n,r){Lt?Ot?Ot.push(r):Ot=[r]:Lt=r,0<(t=Hu(t,"onChange")).length&&(n=new Jt("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Rn=null,Dn=null;function In(e){Iu(e,0)}function Fn(e){if(pt(qe(e)))return e}function Mn(e,t){if("change"===e)return t}var zn=!1;if(Mt){var Bn;if(Mt){var $n="oninput"in document;if(!$n){var Un=document.createElement("div");Un.setAttribute("oninput","return;"),$n="function"==typeof Un.oninput}Bn=$n}else Bn=!1;zn=Bn&&(!document.documentMode||9=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Xn(r)}}function Jn(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?Jn(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function er(e){for(var t=ft((e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.defaultView?e.ownerDocument.defaultView:window).document);t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=ft((e=t.contentWindow).document)}return t}function tr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var nr=Mt&&"documentMode"in document&&11>=document.documentMode,rr=null,or=null,ar=null,ir=!1;function lr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;ir||null==rr||rr!==ft(r)||("selectionStart"in(r=rr)&&tr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},ar&&Yn(ar,r)||(ar=r,0<(r=Hu(or,"onSelect")).length&&(t=new Jt("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=rr)))}function sr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var cr={animationend:sr("Animation","AnimationEnd"),animationiteration:sr("Animation","AnimationIteration"),animationstart:sr("Animation","AnimationStart"),transitionrun:sr("Transition","TransitionRun"),transitionstart:sr("Transition","TransitionStart"),transitioncancel:sr("Transition","TransitionCancel"),transitionend:sr("Transition","TransitionEnd")},ur={},dr={};function pr(e){if(ur[e])return ur[e];if(!cr[e])return e;var t,n=cr[e];for(t in n)if(n.hasOwnProperty(t)&&t in dr)return ur[e]=n[t];return e}Mt&&(dr=document.createElement("div").style,"AnimationEvent"in window||(delete cr.animationend.animation,delete cr.animationiteration.animation,delete cr.animationstart.animation),"TransitionEvent"in window||delete cr.transitionend.transition);var fr=pr("animationend"),mr=pr("animationiteration"),gr=pr("animationstart"),hr=pr("transitionrun"),br=pr("transitionstart"),vr=pr("transitioncancel"),yr=pr("transitionend"),wr=new Map,kr="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function xr(e,t){wr.set(e,t),Qe(t,[e])}kr.push("scrollEnd");var Sr=new WeakMap;function _r(e,t){if("object"==typeof e&&null!==e){var n=Sr.get(e);return void 0!==n?n:(t={value:e,source:t,stack:st(t)},Sr.set(e,t),t)}return{value:e,source:t,stack:st(t)}}var Er=[],Cr=0,Ar=0;function Tr(){for(var e=Cr,t=Ar=Cr=0;t>=i,o-=i,Xr=1<<32-fe(t)+o|n<a?a:8;var i,l,s,c=R.T,u={};R.T=u,$i(e,!1,t,n);try{var d=o(),p=R.S;if(null!==p&&p(u,d),null!==d&&"object"==typeof d&&"function"==typeof d.then)Bi(e,t,(i=r,l=[],s={status:"pending",value:null,reason:null,then:function(e){l.push(e)}},d.then(function(){s.status="fulfilled",s.value=i;for(var e=0;em?(g=d,d=null):g=d.sibling;var h=f(o,d,l[m],s);if(null===h){null===d&&(d=g);break}e&&d&&null===h.alternate&&t(o,d),i=a(h,i,m),null===u?c=h:u.sibling=h,u=h,d=g}if(m===l.length)return n(o,d),ao&&Jr(o,m),c;if(null===d){for(;mg?(h=m,m=null):h=m.sibling;var y=f(o,m,v.value,c);if(null===y){null===m&&(m=h);break}e&&m&&null===y.alternate&&t(o,m),l=a(y,l,g),null===d?u=y:d.sibling=y,d=y,m=h}if(v.done)return n(o,m),ao&&Jr(o,g),u;if(null===m){for(;!v.done;g++,v=s.next())null!==(v=p(o,v.value,c))&&(l=a(v,l,g),null===d?u=v:d.sibling=v,d=v);return ao&&Jr(o,g),u}for(m=r(m);!v.done;g++,v=s.next())null!==(v=b(m,o,g,v.value,c))&&(e&&null!==v.alternate&&m.delete(null===v.key?g:v.key),l=a(v,l,g),null===d?u=v:d.sibling=v,d=v);return e&&m.forEach(function(e){return t(o,e)}),ao&&Jr(o,g),u}(s,c,u=y.call(u),d)}if("function"==typeof u.then)return v(s,c,Xi(u),d);if(u.$$typeof===k)return v(s,c,To(s,u),d);Ji(s,u)}return"string"==typeof u&&""!==u||"number"==typeof u||"bigint"==typeof u?(u=""+u,null!==c&&6===c.tag?(n(s,c.sibling),(d=o(c,u)).return=s,s=d):(n(s,c),(d=Ur(u,s.mode,d)).return=s,s=d),l(s)):n(s,c)}return function(e,t,n,r){try{Yi=0;var o=v(e,t,n,r);return Ki=null,o}catch(i){if(i===Vo||i===Qo)throw i;var a=Ir(29,i,null,e.mode);return a.lanes=r,a.return=e,a}}}var nl=tl(!0),rl=tl(!1),ol=z(null),al=null;function il(e){var t=e.alternate;$(ul,1&ul.current),$(ol,e),null===al&&(null===t||null!==ma.current||null!==t.memoizedState)&&(al=e)}function ll(e){if(22===e.tag){if($(ul,ul.current),$(ol,e),null===al){var t=e.alternate;null!==t&&null!==t.memoizedState&&(al=e)}}else sl()}function sl(){$(ul,ul.current),$(ol,ol.current)}function cl(e){B(ol),al===e&&(al=null),B(ul)}var ul=z(0);function dl(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||hd(n)))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(128&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function pl(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:p({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var fl={enqueueSetState:function(e,t,n){e=e._reactInternals;var r=Rc(),o=aa(r);o.payload=t,null!=n&&(o.callback=n),null!==(t=ia(e,o,r))&&(Ic(t,e,r),la(t,e,r))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=Rc(),o=aa(r);o.tag=1,o.payload=t,null!=n&&(o.callback=n),null!==(t=ia(e,o,r))&&(Ic(t,e,r),la(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Rc(),r=aa(n);r.tag=2,null!=t&&(r.callback=t),null!==(t=ia(e,r,n))&&(Ic(t,e,n),la(t,e,n))}};function ml(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!Yn(n,r)||!Yn(o,a))}function gl(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&fl.enqueueReplaceState(t,t.state,null)}function hl(e,t){var n=t;if("ref"in t)for(var r in n={},t)"ref"!==r&&(n[r]=t[r]);if(e=e.defaultProps)for(var o in n===t&&(n=p({},n)),e)void 0===n[o]&&(n[o]=e[o]);return n}var bl="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)};function vl(e){bl(e)}function yl(e){console.error(e)}function wl(e){bl(e)}function kl(e,t){try{(0,e.onUncaughtError)(t.value,{componentStack:t.stack})}catch(n){setTimeout(function(){throw n})}}function xl(e,t,n){try{(0,e.onCaughtError)(n.value,{componentStack:n.stack,errorBoundary:1===t.tag?t.stateNode:null})}catch(r){setTimeout(function(){throw r})}}function Sl(e,t,n){return(n=aa(n)).tag=3,n.payload={element:null},n.callback=function(){kl(e,t)},n}function _l(e){return(e=aa(e)).tag=3,e}function El(e,t,n,r){var o=n.type.getDerivedStateFromError;if("function"==typeof o){var a=r.value;e.payload=function(){return o(a)},e.callback=function(){xl(t,n,r)}}var i=n.stateNode;null!==i&&"function"==typeof i.componentDidCatch&&(e.callback=function(){xl(t,n,r),"function"!=typeof o&&(null===_c?_c=new Set([this]):_c.add(this));var e=r.stack;this.componentDidCatch(r.value,{componentStack:null!==e?e:""})})}var Cl=Error(i(461)),Al=!1;function Tl(e,t,n,r){t.child=null===e?rl(t,null,n,r):nl(t,e.child,n,r)}function jl(e,t,n,r,o){n=n.render;var a=t.ref;if("ref"in r){var i={};for(var l in r)"ref"!==l&&(i[l]=r[l])}else i=r;return Co(t),r=La(e,t,n,i,a,o),l=Ia(),null===e||Al?(ao&&l&&to(t),t.flags|=1,Tl(e,t,r,o),t.child):(Fa(e,t,o),Kl(e,t,o))}function Pl(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Fr(a)||void 0!==a.defaultProps||null!==n.compare?((e=Br(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,Nl(e,t,a,r,o))}if(a=e.child,!Yl(e,o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:Yn)(i,r)&&e.ref===t.ref)return Kl(e,t,o)}return t.flags|=1,(e=Mr(a,r)).ref=t.ref,e.return=t,t.child=e}function Nl(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(Yn(a,r)&&e.ref===t.ref){if(Al=!1,t.pendingProps=r=a,!Yl(e,o))return t.lanes=e.lanes,Kl(e,t,o);131072&e.flags&&(Al=!0)}}return Dl(e,t,n,r,o)}function Ll(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode){if(128&t.flags){if(r=null!==a?a.baseLanes|n:n,null!==e){for(o=t.child=e.child,a=0;null!==o;)a=a|o.lanes|o.childLanes,o=o.sibling;t.childLanes=a&~r}else t.childLanes=0,t.child=null;return Ol(e,t,r,n)}if(!(536870912&n))return t.lanes=t.childLanes=536870912,Ol(e,t,null!==a?a.baseLanes|n:n,n);t.memoizedState={baseLanes:0,cachePool:null},null!==e&&Ho(0,null!==a?a.cachePool:null),null!==a?ha(t,a):ba(),ll(t)}else null!==a?(Ho(0,a.cachePool),ha(t,a),sl(),t.memoizedState=null):(null!==e&&Ho(0,null),ba(),sl());return Tl(e,t,o,n),t.child}function Ol(e,t,n,r){var o=qo();return o=null===o?null:{parent:Oo._currentValue,pool:o},t.memoizedState={baseLanes:n,cachePool:o},null!==e&&Ho(0,null),ba(),ll(t),null!==e&&_o(e,t,r,!0),null}function Rl(e,t){var n=t.ref;if(null===n)null!==e&&null!==e.ref&&(t.flags|=4194816);else{if("function"!=typeof n&&"object"!=typeof n)throw Error(i(284));null!==e&&e.ref===n||(t.flags|=4194816)}}function Dl(e,t,n,r,o){return Co(t),n=La(e,t,n,r,void 0,o),r=Ia(),null===e||Al?(ao&&r&&to(t),t.flags|=1,Tl(e,t,n,o),t.child):(Fa(e,t,o),Kl(e,t,o))}function Il(e,t,n,r,o,a){return Co(t),t.updateQueue=null,n=Ra(t,r,n,o),Oa(e),r=Ia(),null===e||Al?(ao&&r&&to(t),t.flags|=1,Tl(e,t,n,a),t.child):(Fa(e,t,a),Kl(e,t,a))}function Fl(e,t,n,r,o){if(Co(t),null===t.stateNode){var a=Rr,i=n.contextType;"object"==typeof i&&null!==i&&(a=Ao(i)),a=new n(r,a),t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,a.updater=fl,t.stateNode=a,a._reactInternals=t,(a=t.stateNode).props=r,a.state=t.memoizedState,a.refs={},ra(t),i=n.contextType,a.context="object"==typeof i&&null!==i?Ao(i):Rr,a.state=t.memoizedState,"function"==typeof(i=n.getDerivedStateFromProps)&&(pl(t,n,i,r),a.state=t.memoizedState),"function"==typeof n.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(i=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),i!==a.state&&fl.enqueueReplaceState(a,a.state,null),da(t,r,a,o),ua(),a.state=t.memoizedState),"function"==typeof a.componentDidMount&&(t.flags|=4194308),r=!0}else if(null===e){a=t.stateNode;var l=t.memoizedProps,s=hl(n,l);a.props=s;var c=a.context,u=n.contextType;i=Rr,"object"==typeof u&&null!==u&&(i=Ao(u));var d=n.getDerivedStateFromProps;u="function"==typeof d||"function"==typeof a.getSnapshotBeforeUpdate,l=t.pendingProps!==l,u||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(l||c!==i)&&gl(t,a,r,i),na=!1;var p=t.memoizedState;a.state=p,da(t,r,a,o),ua(),c=t.memoizedState,l||p!==c||na?("function"==typeof d&&(pl(t,n,d,r),c=t.memoizedState),(s=na||ml(t,n,s,r,p,c,i))?(u||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||("function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),"function"==typeof a.componentDidMount&&(t.flags|=4194308)):("function"==typeof a.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=c),a.props=r,a.state=c,a.context=i,r=s):("function"==typeof a.componentDidMount&&(t.flags|=4194308),r=!1)}else{a=t.stateNode,oa(e,t),u=hl(n,i=t.memoizedProps),a.props=u,d=t.pendingProps,p=a.context,c=n.contextType,s=Rr,"object"==typeof c&&null!==c&&(s=Ao(c)),(c="function"==typeof(l=n.getDerivedStateFromProps)||"function"==typeof a.getSnapshotBeforeUpdate)||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(i!==d||p!==s)&&gl(t,a,r,s),na=!1,p=t.memoizedState,a.state=p,da(t,r,a,o),ua();var f=t.memoizedState;i!==d||p!==f||na||null!==e&&null!==e.dependencies&&Eo(e.dependencies)?("function"==typeof l&&(pl(t,n,l,r),f=t.memoizedState),(u=na||ml(t,n,u,r,p,f,s)||null!==e&&null!==e.dependencies&&Eo(e.dependencies))?(c||"function"!=typeof a.UNSAFE_componentWillUpdate&&"function"!=typeof a.componentWillUpdate||("function"==typeof a.componentWillUpdate&&a.componentWillUpdate(r,f,s),"function"==typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,f,s)),"function"==typeof a.componentDidUpdate&&(t.flags|=4),"function"==typeof a.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof a.componentDidUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=f),a.props=r,a.state=f,a.context=s,r=u):("function"!=typeof a.componentDidUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||i===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return a=r,Rl(e,t),r=!!(128&t.flags),a||r?(a=t.stateNode,n=r&&"function"!=typeof n.getDerivedStateFromError?null:a.render(),t.flags|=1,null!==e&&r?(t.child=nl(t,e.child,null,o),t.child=nl(t,null,n,o)):Tl(e,t,n,o),t.memoizedState=a.state,e=t.child):e=Kl(e,t,o),e}function Ml(e,t,n,r){return mo(),t.flags|=256,Tl(e,t,n,r),t.child}var zl={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Bl(e){return{baseLanes:e,cachePool:Go()}}function $l(e,t,n){return e=null!==e?e.childLanes&~n:0,t&&(e|=hc),e}function Ul(e,t,n){var r,o=t.pendingProps,a=!1,l=!!(128&t.flags);if((r=l)||(r=(null===e||null!==e.memoizedState)&&!!(2&ul.current)),r&&(a=!0,t.flags&=-129),r=!!(32&t.flags),t.flags&=-33,null===e){if(ao){if(a?il(t):sl(),ao){var s,c=oo;if(s=c){e:{for(s=c,c=lo;8!==s.nodeType;){if(!c){c=null;break e}if(null===(s=bd(s.nextSibling))){c=null;break e}}c=s}null!==c?(t.memoizedState={dehydrated:c,treeContext:null!==Yr?{id:Xr,overflow:Zr}:null,retryLane:536870912,hydrationErrors:null},(s=Ir(18,null,null,0)).stateNode=c,s.return=t,t.child=s,ro=t,oo=null,s=!0):s=!1}s||co(t)}if(null!==(c=t.memoizedState)&&null!==(c=c.dehydrated))return hd(c)?t.lanes=32:t.lanes=536870912,null;cl(t)}return c=o.children,o=o.fallback,a?(sl(),c=Hl({mode:"hidden",children:c},a=t.mode),o=$r(o,a,n,null),c.return=t,o.return=t,c.sibling=o,t.child=c,(a=t.child).memoizedState=Bl(n),a.childLanes=$l(e,r,n),t.memoizedState=zl,o):(il(t),ql(t,c))}if(null!==(s=e.memoizedState)&&null!==(c=s.dehydrated)){if(l)256&t.flags?(il(t),t.flags&=-257,t=Gl(e,t,n)):null!==t.memoizedState?(sl(),t.child=e.child,t.flags|=128,t=null):(sl(),a=o.fallback,c=t.mode,o=Hl({mode:"visible",children:o.children},c),(a=$r(a,c,n,null)).flags|=2,o.return=t,a.return=t,o.sibling=a,t.child=o,nl(t,e.child,null,n),(o=t.child).memoizedState=Bl(n),o.childLanes=$l(e,r,n),t.memoizedState=zl,t=a);else if(il(t),hd(c)){if(r=c.nextSibling&&c.nextSibling.dataset)var u=r.dgst;r=u,(o=Error(i(419))).stack="",o.digest=r,ho({value:o,source:null,stack:null}),t=Gl(e,t,n)}else if(Al||_o(e,t,n,!1),r=0!==(n&e.childLanes),Al||r){if(null!==(r=rc)&&(0!==(o=0!==((o=42&(o=n&-n)?1:Te(o))&(r.suspendedLanes|n))?0:o)&&o!==s.retryLane))throw s.retryLane=o,Nr(e,o),Ic(r,e,o),Cl;"$?"===c.data||Wc(),t=Gl(e,t,n)}else"$?"===c.data?(t.flags|=192,t.child=e.child,t=null):(e=s.treeContext,oo=bd(c.nextSibling),ro=t,ao=!0,io=null,lo=!1,null!==e&&(Qr[Kr++]=Xr,Qr[Kr++]=Zr,Qr[Kr++]=Yr,Xr=e.id,Zr=e.overflow,Yr=t),(t=ql(t,o.children)).flags|=4096);return t}return a?(sl(),a=o.fallback,c=t.mode,u=(s=e.child).sibling,(o=Mr(s,{mode:"hidden",children:o.children})).subtreeFlags=65011712&s.subtreeFlags,null!==u?a=Mr(u,a):(a=$r(a,c,n,null)).flags|=2,a.return=t,o.return=t,o.sibling=a,t.child=o,o=a,a=t.child,null===(c=e.child.memoizedState)?c=Bl(n):(null!==(s=c.cachePool)?(u=Oo._currentValue,s=s.parent!==u?{parent:u,pool:u}:s):s=Go(),c={baseLanes:c.baseLanes|n,cachePool:s}),a.memoizedState=c,a.childLanes=$l(e,r,n),t.memoizedState=zl,o):(il(t),e=(n=e.child).sibling,(n=Mr(n,{mode:"visible",children:o.children})).return=t,n.sibling=null,null!==e&&(null===(r=t.deletions)?(t.deletions=[e],t.flags|=16):r.push(e)),t.child=n,t.memoizedState=null,n)}function ql(e,t){return(t=Hl({mode:"visible",children:t},e.mode)).return=e,e.child=t}function Hl(e,t){return(e=Ir(22,e,null,t)).lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function Gl(e,t,n){return nl(t,e.child,null,n),(e=ql(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Vl(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),xo(e.return,t,n)}function Wl(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function Ql(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(Tl(e,t,r.children,n),2&(r=ul.current))r=1&r|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Vl(e,n,t);else if(19===e.tag)Vl(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}switch($(ul,r),o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===dl(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),Wl(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===dl(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}Wl(t,!0,n,null,a);break;case"together":Wl(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Kl(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),fc|=t.lanes,0===(n&t.childLanes)){if(null===e)return null;if(_o(e,t,n,!1),0===(n&t.childLanes))return null}if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Mr(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Mr(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Yl(e,t){return 0!==(e.lanes&t)||!(null===(e=e.dependencies)||!Eo(e))}function Xl(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps)Al=!0;else{if(!(Yl(e,n)||128&t.flags))return Al=!1,function(e,t,n){switch(t.tag){case 3:V(t,t.stateNode.containerInfo),wo(0,Oo,e.memoizedState.cache),mo();break;case 27:case 5:Q(t);break;case 4:V(t,t.stateNode.containerInfo);break;case 10:wo(0,t.type,t.memoizedProps.value);break;case 13:var r=t.memoizedState;if(null!==r)return null!==r.dehydrated?(il(t),t.flags|=128,null):0!==(n&t.child.childLanes)?Ul(e,t,n):(il(t),null!==(e=Kl(e,t,n))?e.sibling:null);il(t);break;case 19:var o=!!(128&e.flags);if((r=0!==(n&t.childLanes))||(_o(e,t,n,!1),r=0!==(n&t.childLanes)),o){if(r)return Ql(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),$(ul,ul.current),r)break;return null;case 22:case 23:return t.lanes=0,Ll(e,t,n);case 24:wo(0,Oo,e.memoizedState.cache)}return Kl(e,t,n)}(e,t,n);Al=!!(131072&e.flags)}else Al=!1,ao&&1048576&t.flags&&eo(t,Wr,t.index);switch(t.lanes=0,t.tag){case 16:e:{e=t.pendingProps;var r=t.elementType,o=r._init;if(r=o(r._payload),t.type=r,"function"!=typeof r){if(null!=r){if((o=r.$$typeof)===x){t.tag=11,t=jl(null,t,r,e,n);break e}if(o===E){t.tag=14,t=Pl(null,t,r,e,n);break e}}throw t=L(r)||r,Error(i(306,t,""))}Fr(r)?(e=hl(r,e),t.tag=1,t=Fl(null,t,r,e,n)):(t.tag=0,t=Dl(null,t,r,e,n))}return t;case 0:return Dl(e,t,t.type,t.pendingProps,n);case 1:return Fl(e,t,r=t.type,o=hl(r,t.pendingProps),n);case 3:e:{if(V(t,t.stateNode.containerInfo),null===e)throw Error(i(387));r=t.pendingProps;var a=t.memoizedState;o=a.element,oa(e,t),da(t,r,null,n);var l=t.memoizedState;if(r=l.cache,wo(0,Oo,r),r!==a.cache&&So(t,[Oo],n,!0),ua(),r=l.element,a.isDehydrated){if(a={element:r,isDehydrated:!1,cache:l.cache},t.updateQueue.baseState=a,t.memoizedState=a,256&t.flags){t=Ml(e,t,r,n);break e}if(r!==o){ho(o=_r(Error(i(424)),t)),t=Ml(e,t,r,n);break e}if(9===(e=t.stateNode.containerInfo).nodeType)e=e.body;else e="HTML"===e.nodeName?e.ownerDocument.body:e;for(oo=bd(e.firstChild),ro=t,ao=!0,io=null,lo=!0,n=rl(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(mo(),r===o){t=Kl(e,t,n);break e}Tl(e,t,r,n)}t=t.child}return t;case 26:return Rl(e,t),null===e?(n=Td(t.type,null,t.pendingProps,null))?t.memoizedState=n:ao||(n=t.type,e=t.pendingProps,(r=rd(H.current).createElement(n))[Le]=t,r[Oe]=e,ed(r,n,e),Ge(r),t.stateNode=r):t.memoizedState=Td(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return Q(t),null===e&&ao&&(r=t.stateNode=wd(t.type,t.pendingProps,H.current),ro=t,lo=!0,o=oo,fd(t.type)?(vd=o,oo=bd(r.firstChild)):oo=o),Tl(e,t,t.pendingProps.children,n),Rl(e,t),null===e&&(t.flags|=4194304),t.child;case 5:return null===e&&ao&&((o=r=oo)&&(null!==(r=function(e,t,n,r){for(;1===e.nodeType;){var o=n;if(e.nodeName.toLowerCase()!==t.toLowerCase()){if(!r&&("INPUT"!==e.nodeName||"hidden"!==e.type))break}else if(r){if(!e[ze])switch(t){case"meta":if(!e.hasAttribute("itemprop"))break;return e;case"link":if("stylesheet"===(a=e.getAttribute("rel"))&&e.hasAttribute("data-precedence"))break;if(a!==o.rel||e.getAttribute("href")!==(null==o.href||""===o.href?null:o.href)||e.getAttribute("crossorigin")!==(null==o.crossOrigin?null:o.crossOrigin)||e.getAttribute("title")!==(null==o.title?null:o.title))break;return e;case"style":if(e.hasAttribute("data-precedence"))break;return e;case"script":if(((a=e.getAttribute("src"))!==(null==o.src?null:o.src)||e.getAttribute("type")!==(null==o.type?null:o.type)||e.getAttribute("crossorigin")!==(null==o.crossOrigin?null:o.crossOrigin))&&a&&e.hasAttribute("async")&&!e.hasAttribute("itemprop"))break;return e;default:return e}}else{if("input"!==t||"hidden"!==e.type)return e;var a=null==o.name?null:""+o.name;if("hidden"===o.type&&e.getAttribute("name")===a)return e}if(null===(e=bd(e.nextSibling)))break}return null}(r,t.type,t.pendingProps,lo))?(t.stateNode=r,ro=t,oo=bd(r.firstChild),lo=!1,o=!0):o=!1),o||co(t)),Q(t),o=t.type,a=t.pendingProps,l=null!==e?e.memoizedProps:null,r=a.children,id(o,a)?r=null:null!==l&&id(o,l)&&(t.flags|=32),null!==t.memoizedState&&(o=La(e,t,Da,null,null,n),Qd._currentValue=o),Rl(e,t),Tl(e,t,r,n),t.child;case 6:return null===e&&ao&&((e=n=oo)&&(null!==(n=function(e,t,n){if(""===t)return null;for(;3!==e.nodeType;){if((1!==e.nodeType||"INPUT"!==e.nodeName||"hidden"!==e.type)&&!n)return null;if(null===(e=bd(e.nextSibling)))return null}return e}(n,t.pendingProps,lo))?(t.stateNode=n,ro=t,oo=null,e=!0):e=!1),e||co(t)),null;case 13:return Ul(e,t,n);case 4:return V(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=nl(t,null,r,n):Tl(e,t,r,n),t.child;case 11:return jl(e,t,t.type,t.pendingProps,n);case 7:return Tl(e,t,t.pendingProps,n),t.child;case 8:case 12:return Tl(e,t,t.pendingProps.children,n),t.child;case 10:return r=t.pendingProps,wo(0,t.type,r.value),Tl(e,t,r.children,n),t.child;case 9:return o=t.type._context,r=t.pendingProps.children,Co(t),r=r(o=Ao(o)),t.flags|=1,Tl(e,t,r,n),t.child;case 14:return Pl(e,t,t.type,t.pendingProps,n);case 15:return Nl(e,t,t.type,t.pendingProps,n);case 19:return Ql(e,t,n);case 31:return r=t.pendingProps,n=t.mode,r={mode:r.mode,children:r.children},null===e?((n=Hl(r,n)).ref=t.ref,t.child=n,n.return=t,t=n):((n=Mr(e.child,r)).ref=t.ref,t.child=n,n.return=t,t=n),t;case 22:return Ll(e,t,n);case 24:return Co(t),r=Ao(Oo),null===e?(null===(o=qo())&&(o=rc,a=Ro(),o.pooledCache=a,a.refCount++,null!==a&&(o.pooledCacheLanes|=n),o=a),t.memoizedState={parent:r,cache:o},ra(t),wo(0,Oo,o)):(0!==(e.lanes&n)&&(oa(e,t),da(t,null,null,n),ua()),o=e.memoizedState,a=t.memoizedState,o.parent!==r?(o={parent:r,cache:r},t.memoizedState=o,0===t.lanes&&(t.memoizedState=t.updateQueue.baseState=o),wo(0,Oo,r)):(r=a.cache,wo(0,Oo,r),r!==o.cache&&So(t,[Oo],n,!0))),Tl(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(i(156,t.tag))}function Zl(e){e.flags|=4}function Jl(e,t){if("stylesheet"!==t.type||4&t.state.loading)e.flags&=-16777217;else if(e.flags|=16777216,!$d(t)){if(null!==(t=ol.current)&&((4194048&ac)===ac?null!==al:(62914560&ac)!==ac&&!(536870912&ac)||t!==al))throw Jo=Ko,Wo;e.flags|=8192}}function es(e,t){null!==t&&(e.flags|=4),16384&e.flags&&(t=22!==e.tag?Se():536870912,e.lanes|=t,bc|=t)}function ts(e,t){if(!ao)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function ns(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=65011712&o.subtreeFlags,r|=65011712&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function rs(e,t,n){var r=t.pendingProps;switch(no(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:case 1:return ns(t),null;case 3:return n=t.stateNode,r=null,null!==e&&(r=e.memoizedState.cache),t.memoizedState.cache!==r&&(t.flags|=2048),ko(Oo),W(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),null!==e&&null!==e.child||(fo(t)?Zl(t):null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,go())),ns(t),null;case 26:return n=t.memoizedState,null===e?(Zl(t),null!==n?(ns(t),Jl(t,n)):(ns(t),t.flags&=-16777217)):n?n!==e.memoizedState?(Zl(t),ns(t),Jl(t,n)):(ns(t),t.flags&=-16777217):(e.memoizedProps!==r&&Zl(t),ns(t),t.flags&=-16777217),null;case 27:K(t),n=H.current;var o=t.type;if(null!==e&&null!=t.stateNode)e.memoizedProps!==r&&Zl(t);else{if(!r){if(null===t.stateNode)throw Error(i(166));return ns(t),null}e=U.current,fo(t)?uo(t):(e=wd(o,r,n),t.stateNode=e,Zl(t))}return ns(t),null;case 5:if(K(t),n=t.type,null!==e&&null!=t.stateNode)e.memoizedProps!==r&&Zl(t);else{if(!r){if(null===t.stateNode)throw Error(i(166));return ns(t),null}if(e=U.current,fo(t))uo(t);else{switch(o=rd(H.current),e){case 1:e=o.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:e=o.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":e=o.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":e=o.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":(e=o.createElement("div")).innerHTML=" - - + + -
Version: 2.0.3

Development

+
Version: 2.0.3

Development

The exporter is a Go program using the Prometheus SDK.

External contributions are welcome, see CONTRIBUTING for details.

The exporter initialization is as follows:

diff --git a/docs/docs/2.0.3/advanced/go-runtime/index.html b/docs/docs/2.0.3/advanced/go-runtime/index.html index 635d545f..e664df15 100644 --- a/docs/docs/2.0.3/advanced/go-runtime/index.html +++ b/docs/docs/2.0.3/advanced/go-runtime/index.html @@ -4,14 +4,14 @@ Configuring the Go Runtime | Oracle Database Metrics Exporter - - + + -
Version: 2.0.3

Exporter Go Runtime

+
Version: 2.0.3

Exporter Go Runtime

If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter's usage of memory.

Under normal circumstances, the exporter process will retain OS memory that was used by the Go garbage collector but is no longer needed, in case it may be needed again in the future, unless the host OS is under memory pressure. The result of this behavior (which is the normal behavior of the Go runtime) is that the resident set size will not decrease until the host OS memory is almost all used. Under most circumstances, this will not cause any issues, but if you are in an environment where you need to conserve memory, the following options are provided:

    diff --git a/docs/docs/2.0.3/advanced/txeventq/index.html b/docs/docs/2.0.3/advanced/txeventq/index.html index af74b492..43ccc08f 100644 --- a/docs/docs/2.0.3/advanced/txeventq/index.html +++ b/docs/docs/2.0.3/advanced/txeventq/index.html @@ -4,14 +4,14 @@ Monitoring TxEventQ | Oracle Database Metrics Exporter - - + + -
    Version: 2.0.3

    Monitoring Transactional Event Queues

    +
    Version: 2.0.3

    Monitoring Transactional Event Queues

    Oracle Transactional Event Queues ("TxEventQ") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.

    Access to the real-time broker, producer, and consumer metrics in a single dashboard and receiving alerts for issues allows teams to understand the state of their system.

    The exporter includes a set of metrics for monitoring TxEventQ and a pre-built Grafana dashboard.

    diff --git a/docs/docs/2.0.3/category/advanced/index.html b/docs/docs/2.0.3/category/advanced/index.html index a36b2b17..3329cf81 100644 --- a/docs/docs/2.0.3/category/advanced/index.html +++ b/docs/docs/2.0.3/category/advanced/index.html @@ -4,13 +4,13 @@ Advanced | Oracle Database Metrics Exporter - - + + - + \ No newline at end of file diff --git a/docs/docs/2.0.3/category/configuration/index.html b/docs/docs/2.0.3/category/configuration/index.html index 18f8a811..d4fbb02f 100644 --- a/docs/docs/2.0.3/category/configuration/index.html +++ b/docs/docs/2.0.3/category/configuration/index.html @@ -4,13 +4,13 @@ Configuration | Oracle Database Metrics Exporter - - + + - + \ No newline at end of file diff --git a/docs/docs/2.0.3/category/getting-started/index.html b/docs/docs/2.0.3/category/getting-started/index.html index b69de3cb..d10ae5d6 100644 --- a/docs/docs/2.0.3/category/getting-started/index.html +++ b/docs/docs/2.0.3/category/getting-started/index.html @@ -4,13 +4,13 @@ Getting Started | Oracle Database Metrics Exporter - - + + - + \ No newline at end of file diff --git a/docs/docs/2.0.3/category/releases/index.html b/docs/docs/2.0.3/category/releases/index.html index 2f0d5b96..9f5cfc47 100644 --- a/docs/docs/2.0.3/category/releases/index.html +++ b/docs/docs/2.0.3/category/releases/index.html @@ -4,13 +4,13 @@ Releases | Oracle Database Metrics Exporter - - + + -
    Version: 2.0.3

    Releases

    Information on the exporter releases, changelog, and roadmap.

    +
    Version: 2.0.3

    Releases

    Information on the exporter releases, changelog, and roadmap.

    \ No newline at end of file diff --git a/docs/docs/2.0.3/configuration/alert-logs/index.html b/docs/docs/2.0.3/configuration/alert-logs/index.html index b680d157..124950a6 100644 --- a/docs/docs/2.0.3/configuration/alert-logs/index.html +++ b/docs/docs/2.0.3/configuration/alert-logs/index.html @@ -4,14 +4,14 @@ Alert Logs | Oracle Database Metrics Exporter - - + + -
    Version: 2.0.3

    Alert logs

    +
    Version: 2.0.3

    Alert logs

    Collect export alert logs with a log ingestion tool.

    The exporter exports alert log records as a JSON file suitable for collection by a log ingestion tool like Promtail or FluentBit.

    Alert logging is configured with the following parameters in the exporter config file:

    diff --git a/docs/docs/2.0.3/configuration/azure-vault/index.html b/docs/docs/2.0.3/configuration/azure-vault/index.html index dee61e74..dda311d2 100644 --- a/docs/docs/2.0.3/configuration/azure-vault/index.html +++ b/docs/docs/2.0.3/configuration/azure-vault/index.html @@ -4,14 +4,14 @@ Azure Vault | Oracle Database Metrics Exporter - - + + -
    Version: 2.0.3

    Azure Vault

    +
    Version: 2.0.3

    Azure Vault

    Securely load database credentials from Azure Vault.

    Each database in the config file may be configured to use Azure Vault. To load the database username and/or password from Azure Vault, set the vault.azure property to contain the Azure Vault ID, and secret names for the database username/password:

    databases:
    mydb:
    vault:
    azure:
    id: <VAULT ID>
    usernameSecret: <Secret containing DB username>
    passwordSecret: <Secret containing DB password>
    diff --git a/docs/docs/2.0.3/configuration/config-file/index.html b/docs/docs/2.0.3/configuration/config-file/index.html index 0592eb1d..2102edf7 100644 --- a/docs/docs/2.0.3/configuration/config-file/index.html +++ b/docs/docs/2.0.3/configuration/config-file/index.html @@ -4,14 +4,14 @@ Exporter Config File | Oracle Database Metrics Exporter - - + + -
    Version: 2.0.3

    Exporter Config File

    +
    Version: 2.0.3

    Exporter Config File

    The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.

    The configuration file contains the following options:

    # Example Oracle Database Metrics Exporter Configuration file.
    # Environment variables of the form ${VAR_NAME} will be expanded.
    # If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,
    # "$test$pwd" => "$$test$$pwd"
    # Otherwise, the value will be expanded as an environment variable.

    # Example Oracle Database Metrics Exporter Configuration file.
    # Environment variables of the form ${VAR_NAME} will be expanded.

    databases:
    ## Path on which metrics will be served
    # metricsPath: /metrics
    ## Database connection information for the "default" database.
    default:
    ## Database username
    username: ${DB_USERNAME}
    ## Database password
    password: ${DB_PASSWORD}
    ## Database password file
    ## If specified, will load the database password from a file.
    # passwordFile: ${DB_PASSWORD_FILE}
    ## Database connection url
    url: localhost:1521/freepdb1

    ## Metrics query timeout for this database, in seconds
    queryTimeout: 5

    ## Rely on Oracle Database External Authentication by network or OS
    # externalAuth: false
    ## Database role
    # role: SYSDBA
    ## Path to Oracle Database wallet, if using wallet
    # tnsAdmin: /path/to/database/wallet

    ### Connection settings:
    ### Either the go-sql or Oracle Database connection pool may be used.
    ### To use the Oracle Database connection pool over the go-sql connection pool,
    ### set maxIdleConns to zero and configure the pool* settings.

    ### Connection pooling settings for the go-sql connection pool
    ## Max open connections for this database using go-sql connection pool
    maxOpenConns: 10
    ## Max idle connections for this database using go-sql connection pool
    maxIdleConns: 10

    ### Connection pooling settings for the Oracle Database connection pool
    ## Oracle Database connection pool increment.
    # poolIncrement: 1
    ## Oracle Database Connection pool maximum size
    # poolMaxConnections: 15
    ## Oracle Database Connection pool minimum size
    # poolMinConnections: 15

    ## Arbitrary labels to add to each metric scraped from this database
    # labels:
    # label_name1: label_value1
    # label_name2: label_value2

    metrics:
    ## How often to scrape metrics. If not provided, metrics will be scraped on request.
    # scrapeInterval: 15s
    ## Path to default metrics file.
    default: default-metrics.toml
    ## Paths to any custom metrics files
    custom:
    - custom-metrics-example/custom-metrics.toml

    log:
    # Path of log file
    destination: /opt/alert.log
    # Interval of log updates
    interval: 15s
    ## Set disable to 1 to disable logging
    # disable: 0

    # Optionally configure prometheus webserver
    #web:
    # listenAddresses: [':9161']
    # systemdSocket: true|false
    # configFile: /path/to/webconfigfile
    diff --git a/docs/docs/2.0.3/configuration/custom-metrics/index.html b/docs/docs/2.0.3/configuration/custom-metrics/index.html index d662f47e..919dda20 100644 --- a/docs/docs/2.0.3/configuration/custom-metrics/index.html +++ b/docs/docs/2.0.3/configuration/custom-metrics/index.html @@ -4,14 +4,14 @@ Custom Metrics | Oracle Database Metrics Exporter - - + + -
    Version: 2.0.3

    Custom Metrics

    +
    Version: 2.0.3

    Custom Metrics

    The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.

    To specify custom metrics files exporter, use the metrics configuration in the config file:

    diff --git a/docs/docs/2.0.3/configuration/multiple-databases/index.html b/docs/docs/2.0.3/configuration/multiple-databases/index.html index 7accaac0..32d61f54 100644 --- a/docs/docs/2.0.3/configuration/multiple-databases/index.html +++ b/docs/docs/2.0.3/configuration/multiple-databases/index.html @@ -4,14 +4,14 @@ Multiple Databases | Oracle Database Metrics Exporter - - + + -
    Version: 2.0.3

    Scraping Multiple Databases

    +
    Version: 2.0.3

    Scraping Multiple Databases

    The exporter may be configured to scrape as many databases as needed.

    You may scrape as many databases as needed by defining named database configurations in the config file.

    If you're connecting to multiple databases using mTLS, see mTLS for multiple databases with Oracle Wallet

    diff --git a/docs/docs/2.0.3/configuration/oci-vault/index.html b/docs/docs/2.0.3/configuration/oci-vault/index.html index f01b626e..233ba8f0 100644 --- a/docs/docs/2.0.3/configuration/oci-vault/index.html +++ b/docs/docs/2.0.3/configuration/oci-vault/index.html @@ -4,14 +4,14 @@ OCI Vault | Oracle Database Metrics Exporter - - + + -
    Version: 2.0.3

    Oracle Cloud Infrastructure (OCI) Vault

    +
    Version: 2.0.3

    Oracle Cloud Infrastructure (OCI) Vault

    Securely load database credentials from OCI Vault.

    Each database in the config file may be configured to use OCI Vault. To load the database username and/or password from OCI Vault, set the vault.oci property to contain the OCI Vault OCID, and secret names for the database username/password:

    databases:
    mydb:
    vault:
    oci:
    id: <VAULT OCID>
    usernameSecret: <Secret containing DB username>
    passwordSecret: <Secret containing DB password>
    diff --git a/docs/docs/2.0.3/configuration/oracle-wallet/index.html b/docs/docs/2.0.3/configuration/oracle-wallet/index.html index 56c3fb6c..7b748c23 100644 --- a/docs/docs/2.0.3/configuration/oracle-wallet/index.html +++ b/docs/docs/2.0.3/configuration/oracle-wallet/index.html @@ -4,14 +4,14 @@ Oracle Wallet (mTLS) | Oracle Database Metrics Exporter - - + + -
    Version: 2.0.3

    Using a Wallet

    +
    Version: 2.0.3

    Using a Wallet

    For mutual TLS (mTLS) connections, you must use an Oracle Wallet.

    If you are using Oracle Autonomous Database with mTLS, for example, you can download and unzip the wallet from the Oracle Cloud Infrastructure (OCI) console.

    To configure the exporter to use an Oracle Wallet,

    diff --git a/docs/docs/2.0.3/getting-started/basics/index.html b/docs/docs/2.0.3/getting-started/basics/index.html index b98a3049..abb3fc2e 100644 --- a/docs/docs/2.0.3/getting-started/basics/index.html +++ b/docs/docs/2.0.3/getting-started/basics/index.html @@ -4,14 +4,14 @@ Installation | Oracle Database Metrics Exporter - - + + -
    Version: 2.0.3

    Installation

    +
    Version: 2.0.3

    Installation

    In this section you will find information on running the exporter.

    • In a container runtime like Docker, Podman, etc
    • diff --git a/docs/docs/2.0.3/getting-started/default-metrics/index.html b/docs/docs/2.0.3/getting-started/default-metrics/index.html index 4b2f2c5a..a928863e 100644 --- a/docs/docs/2.0.3/getting-started/default-metrics/index.html +++ b/docs/docs/2.0.3/getting-started/default-metrics/index.html @@ -4,14 +4,14 @@ Default Metrics | Oracle Database Metrics Exporter - - + + -
      Version: 2.0.3

      Default Metrics

      +
      Version: 2.0.3

      Default Metrics

      The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.

      You can find the exporter's metric schema in the Custom Metrics configuration.

      The following metrics are included by default. The values given are a sample for a single database, "db1":

      diff --git a/docs/docs/2.0.3/getting-started/grafana-dashboards/index.html b/docs/docs/2.0.3/getting-started/grafana-dashboards/index.html index e073a770..764a0e3d 100644 --- a/docs/docs/2.0.3/getting-started/grafana-dashboards/index.html +++ b/docs/docs/2.0.3/getting-started/grafana-dashboards/index.html @@ -4,14 +4,14 @@ Grafana Dashboards | Oracle Database Metrics Exporter - - + + -
      Version: 2.0.3

      Grafana Dashboards

      +
      Version: 2.0.3

      Grafana Dashboards

      Sample Grafana dashboards are included with the exporter.

      A sample Grafana dashboard definition is provided in this directory. You can import these dashboards into your Grafana instance, and set it to use the Prometheus datasource that you have defined for the Prometheus instance that is collecting metrics from the exporter.

      The dashboard shows some basic information, as shown below:

      diff --git a/docs/docs/2.0.3/getting-started/kubernetes/index.html b/docs/docs/2.0.3/getting-started/kubernetes/index.html index 60333971..ec0bf6ec 100644 --- a/docs/docs/2.0.3/getting-started/kubernetes/index.html +++ b/docs/docs/2.0.3/getting-started/kubernetes/index.html @@ -4,14 +4,14 @@ Kubernetes | Oracle Database Metrics Exporter - - + + -
      Version: 2.0.3

      Kubernetes

      +
      Version: 2.0.3

      Kubernetes

      You can run the exporter in Kubernetes using provided manifests.

      To run the exporter in Kubernetes, you must complete the following steps. All steps must be completed in the same Kunernetes namespace. The examples below assume you want to use a namespace called exporter, you must change the commands if you wish to use a different namespace.

      Create a secret with credentials for connecting to the Oracle Database

      diff --git a/docs/docs/2.0.3/intro/index.html b/docs/docs/2.0.3/intro/index.html index 77398aaf..c0150945 100644 --- a/docs/docs/2.0.3/intro/index.html +++ b/docs/docs/2.0.3/intro/index.html @@ -4,14 +4,14 @@ OpenTelemetry Metrics for Oracle Database | Oracle Database Metrics Exporter - - + + -
      Version: 2.0.3

      OpenTelemetry Metrics for Oracle Database

      +
      Version: 2.0.3

      OpenTelemetry Metrics for Oracle Database

      This project aims to provide observability for the Oracle Database so that users can understand performance and diagnose issues easily across applications and database. Over time, this project will provide not just metrics, but also logging and tracing support, and integration into popular frameworks like Spring Boot. The project aims to deliver functionality to support both cloud and on-premises databases, including those running in Kubernetes and containers.

      Contributions are welcome - please see contributing.

      Oracle Database Dashboard

      diff --git a/docs/docs/2.0.3/releases/changelog/index.html b/docs/docs/2.0.3/releases/changelog/index.html index c5ccf81c..540f5c8a 100644 --- a/docs/docs/2.0.3/releases/changelog/index.html +++ b/docs/docs/2.0.3/releases/changelog/index.html @@ -4,14 +4,14 @@ Changelog | Oracle Database Metrics Exporter - - + + -
      Version: 2.0.3

      Release Notes

      +
      Version: 2.0.3

      Release Notes

      List of changes to the exporter.

      Version 2.0.3, August 27, 2025

      This release includes the following changes:

      diff --git a/docs/docs/2.0.3/releases/roadmap/index.html b/docs/docs/2.0.3/releases/roadmap/index.html index 68d7a53a..083f5d64 100644 --- a/docs/docs/2.0.3/releases/roadmap/index.html +++ b/docs/docs/2.0.3/releases/roadmap/index.html @@ -4,14 +4,14 @@ Roadmap | Oracle Database Metrics Exporter - - + + -
      Version: 2.0.3

      Exporter Roadmap

      +
      Version: 2.0.3

      Exporter Roadmap

      Planned and upcoming features for the exporter.

      We welcome input on community-driven features you'd like to see supported. Please open an issue in this repository with your suggestions.

      Currently, we plan to address the following key features:

      diff --git a/docs/docs/2.0.4/advanced/development/index.html b/docs/docs/2.0.4/advanced/development/index.html index 9711e83b..6db068e6 100644 --- a/docs/docs/2.0.4/advanced/development/index.html +++ b/docs/docs/2.0.4/advanced/development/index.html @@ -4,14 +4,14 @@ Development | Oracle Database Metrics Exporter - - + + -
      Version: 2.0.4

      Development

      +
      Version: 2.0.4

      Development

      The exporter is a Go program using the Prometheus SDK.

      External contributions are welcome, see CONTRIBUTING for details.

      The exporter initialization is as follows:

      diff --git a/docs/docs/2.0.4/advanced/go-runtime/index.html b/docs/docs/2.0.4/advanced/go-runtime/index.html index 345a2f5d..6102a906 100644 --- a/docs/docs/2.0.4/advanced/go-runtime/index.html +++ b/docs/docs/2.0.4/advanced/go-runtime/index.html @@ -4,14 +4,14 @@ Configuring the Go Runtime | Oracle Database Metrics Exporter - - + + -
      Version: 2.0.4

      Exporter Go Runtime

      +
      Version: 2.0.4

      Exporter Go Runtime

      If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter's usage of memory.

      Under normal circumstances, the exporter process will retain OS memory that was used by the Go garbage collector but is no longer needed, in case it may be needed again in the future, unless the host OS is under memory pressure. The result of this behavior (which is the normal behavior of the Go runtime) is that the resident set size will not decrease until the host OS memory is almost all used. Under most circumstances, this will not cause any issues, but if you are in an environment where you need to conserve memory, the following options are provided:

        diff --git a/docs/docs/2.0.4/advanced/txeventq/index.html b/docs/docs/2.0.4/advanced/txeventq/index.html index 485d9e08..f5f01f51 100644 --- a/docs/docs/2.0.4/advanced/txeventq/index.html +++ b/docs/docs/2.0.4/advanced/txeventq/index.html @@ -4,14 +4,14 @@ Monitoring TxEventQ | Oracle Database Metrics Exporter - - + + -
        Version: 2.0.4

        Monitoring Transactional Event Queues

        +
        Version: 2.0.4

        Monitoring Transactional Event Queues

        Oracle Transactional Event Queues ("TxEventQ") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.

        Access to the real-time broker, producer, and consumer metrics in a single dashboard and receiving alerts for issues allows teams to understand the state of their system.

        The exporter includes a set of metrics for monitoring TxEventQ and a pre-built Grafana dashboard.

        diff --git a/docs/docs/2.0.4/category/advanced/index.html b/docs/docs/2.0.4/category/advanced/index.html index fbab75c9..4a0a242a 100644 --- a/docs/docs/2.0.4/category/advanced/index.html +++ b/docs/docs/2.0.4/category/advanced/index.html @@ -4,13 +4,13 @@ Advanced | Oracle Database Metrics Exporter - - + + - + \ No newline at end of file diff --git a/docs/docs/2.0.4/category/configuration/index.html b/docs/docs/2.0.4/category/configuration/index.html index a949b341..4c9d9b5a 100644 --- a/docs/docs/2.0.4/category/configuration/index.html +++ b/docs/docs/2.0.4/category/configuration/index.html @@ -4,13 +4,13 @@ Configuration | Oracle Database Metrics Exporter - - + + - + \ No newline at end of file diff --git a/docs/docs/2.0.4/category/getting-started/index.html b/docs/docs/2.0.4/category/getting-started/index.html index ac2278b7..00cae8e2 100644 --- a/docs/docs/2.0.4/category/getting-started/index.html +++ b/docs/docs/2.0.4/category/getting-started/index.html @@ -4,13 +4,13 @@ Getting Started | Oracle Database Metrics Exporter - - + + - + \ No newline at end of file diff --git a/docs/docs/2.0.4/category/releases/index.html b/docs/docs/2.0.4/category/releases/index.html index 3da7f61d..bc48bba9 100644 --- a/docs/docs/2.0.4/category/releases/index.html +++ b/docs/docs/2.0.4/category/releases/index.html @@ -4,13 +4,13 @@ Releases | Oracle Database Metrics Exporter - - + + -
        Version: 2.0.4

        Releases

        Information on the exporter releases, changelog, and roadmap.

        +
        Version: 2.0.4

        Releases

        Information on the exporter releases, changelog, and roadmap.

        \ No newline at end of file diff --git a/docs/docs/2.0.4/configuration/alert-logs/index.html b/docs/docs/2.0.4/configuration/alert-logs/index.html index 0a6d4177..b6145a88 100644 --- a/docs/docs/2.0.4/configuration/alert-logs/index.html +++ b/docs/docs/2.0.4/configuration/alert-logs/index.html @@ -4,14 +4,14 @@ Alert Logs | Oracle Database Metrics Exporter - - + + -
        Version: 2.0.4

        Alert logs

        +
        Version: 2.0.4

        Alert logs

        Collect export alert logs with a log ingestion tool.

        The exporter exports alert log records as a JSON file suitable for collection by a log ingestion tool like Promtail or FluentBit.

        Alert logging is configured with the following parameters in the exporter config file:

        diff --git a/docs/docs/2.0.4/configuration/azure-vault/index.html b/docs/docs/2.0.4/configuration/azure-vault/index.html index 34401ef6..630b54df 100644 --- a/docs/docs/2.0.4/configuration/azure-vault/index.html +++ b/docs/docs/2.0.4/configuration/azure-vault/index.html @@ -4,14 +4,14 @@ Azure Vault | Oracle Database Metrics Exporter - - + + -
        Version: 2.0.4

        Azure Vault

        +
        Version: 2.0.4

        Azure Vault

        Securely load database credentials from Azure Vault.

        Each database in the config file may be configured to use Azure Vault. To load the database username and/or password from Azure Vault, set the vault.azure property to contain the Azure Vault ID, and secret names for the database username/password:

        databases:
        mydb:
        vault:
        azure:
        id: <VAULT ID>
        usernameSecret: <Secret containing DB username>
        passwordSecret: <Secret containing DB password>
        diff --git a/docs/docs/2.0.4/configuration/config-file/index.html b/docs/docs/2.0.4/configuration/config-file/index.html index 55ce2da8..8c7f9c62 100644 --- a/docs/docs/2.0.4/configuration/config-file/index.html +++ b/docs/docs/2.0.4/configuration/config-file/index.html @@ -4,14 +4,14 @@ Exporter Config File | Oracle Database Metrics Exporter - - + + -
        Version: 2.0.4

        Exporter Config File

        +
        Version: 2.0.4

        Exporter Config File

        The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.

        The configuration file contains the following options:

        # Example Oracle Database Metrics Exporter Configuration file.
        # Environment variables of the form ${VAR_NAME} will be expanded.
        # If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,
        # "$test$pwd" => "$$test$$pwd"
        # Otherwise, the value will be expanded as an environment variable.

        # Example Oracle Database Metrics Exporter Configuration file.
        # Environment variables of the form ${VAR_NAME} will be expanded.

        databases:
        ## Path on which metrics will be served
        # metricsPath: /metrics
        ## Database connection information for the "default" database.
        default:
        ## Database username
        username: ${DB_USERNAME}
        ## Database password
        password: ${DB_PASSWORD}
        ## Database password file
        ## If specified, will load the database password from a file.
        # passwordFile: ${DB_PASSWORD_FILE}
        ## Database connection url
        url: localhost:1521/freepdb1

        ## Metrics query timeout for this database, in seconds
        queryTimeout: 5

        ## Rely on Oracle Database External Authentication by network or OS
        # externalAuth: false
        ## Database role
        # role: SYSDBA
        ## Path to Oracle Database wallet, if using wallet
        # tnsAdmin: /path/to/database/wallet

        ### Connection settings:
        ### Either the go-sql or Oracle Database connection pool may be used.
        ### To use the Oracle Database connection pool over the go-sql connection pool,
        ### set maxIdleConns to zero and configure the pool* settings.

        ### Connection pooling settings for the go-sql connection pool
        ## Max open connections for this database using go-sql connection pool
        maxOpenConns: 10
        ## Max idle connections for this database using go-sql connection pool
        maxIdleConns: 10

        ### Connection pooling settings for the Oracle Database connection pool
        ## Oracle Database connection pool increment.
        # poolIncrement: 1
        ## Oracle Database Connection pool maximum size
        # poolMaxConnections: 15
        ## Oracle Database Connection pool minimum size
        # poolMinConnections: 15

        ## Arbitrary labels to add to each metric scraped from this database
        # labels:
        # label_name1: label_value1
        # label_name2: label_value2

        metrics:
        ## How often to scrape metrics. If not provided, metrics will be scraped on request.
        # scrapeInterval: 15s
        ## Path to default metrics file.
        default: default-metrics.toml
        ## Paths to any custom metrics files
        custom:
        - custom-metrics-example/custom-metrics.toml

        log:
        # Path of log file
        destination: /opt/alert.log
        # Interval of log updates
        interval: 15s
        ## Set disable to 1 to disable logging
        # disable: 0

        # Optionally configure prometheus webserver
        #web:
        # listenAddresses: [':9161']
        # systemdSocket: true|false
        # configFile: /path/to/webconfigfile
        diff --git a/docs/docs/2.0.4/configuration/custom-metrics/index.html b/docs/docs/2.0.4/configuration/custom-metrics/index.html index f67c718b..6c46ab2b 100644 --- a/docs/docs/2.0.4/configuration/custom-metrics/index.html +++ b/docs/docs/2.0.4/configuration/custom-metrics/index.html @@ -4,14 +4,14 @@ Custom Metrics | Oracle Database Metrics Exporter - - + + -
        Version: 2.0.4

        Custom Metrics

        +
        Version: 2.0.4

        Custom Metrics

        The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.

        To specify custom metrics files exporter, use the metrics configuration in the config file:

        diff --git a/docs/docs/2.0.4/configuration/multiple-databases/index.html b/docs/docs/2.0.4/configuration/multiple-databases/index.html index 7abcd9e7..9486ac80 100644 --- a/docs/docs/2.0.4/configuration/multiple-databases/index.html +++ b/docs/docs/2.0.4/configuration/multiple-databases/index.html @@ -4,14 +4,14 @@ Multiple Databases | Oracle Database Metrics Exporter - - + + -
        Version: 2.0.4

        Scraping Multiple Databases

        +
        Version: 2.0.4

        Scraping Multiple Databases

        The exporter may be configured to scrape as many databases as needed.

        You may scrape as many databases as needed by defining named database configurations in the config file.

        If you're connecting to multiple databases using mTLS, see mTLS for multiple databases with Oracle Wallet

        diff --git a/docs/docs/2.0.4/configuration/oci-vault/index.html b/docs/docs/2.0.4/configuration/oci-vault/index.html index 1d2e6426..a66bffe7 100644 --- a/docs/docs/2.0.4/configuration/oci-vault/index.html +++ b/docs/docs/2.0.4/configuration/oci-vault/index.html @@ -4,14 +4,14 @@ OCI Vault | Oracle Database Metrics Exporter - - + + -
        Version: 2.0.4

        Oracle Cloud Infrastructure (OCI) Vault

        +
        Version: 2.0.4

        Oracle Cloud Infrastructure (OCI) Vault

        Securely load database credentials from OCI Vault.

        Each database in the config file may be configured to use OCI Vault. To load the database username and/or password from OCI Vault, set the vault.oci property to contain the OCI Vault OCID, and secret names for the database username/password:

        databases:
        mydb:
        vault:
        oci:
        id: <VAULT OCID>
        usernameSecret: <Secret containing DB username>
        passwordSecret: <Secret containing DB password>
        diff --git a/docs/docs/2.0.4/configuration/oracle-wallet/index.html b/docs/docs/2.0.4/configuration/oracle-wallet/index.html index 19055ab4..452a473d 100644 --- a/docs/docs/2.0.4/configuration/oracle-wallet/index.html +++ b/docs/docs/2.0.4/configuration/oracle-wallet/index.html @@ -4,14 +4,14 @@ Oracle Wallet (mTLS) | Oracle Database Metrics Exporter - - + + -
        Version: 2.0.4

        Using a Wallet

        +
        Version: 2.0.4

        Using a Wallet

        For mutual TLS (mTLS) connections, you must use an Oracle Wallet.

        If you are using Oracle Autonomous Database with mTLS, for example, you can download and unzip the wallet from the Oracle Cloud Infrastructure (OCI) console.

        To configure the exporter to use an Oracle Wallet,

        diff --git a/docs/docs/2.0.4/getting-started/basics/index.html b/docs/docs/2.0.4/getting-started/basics/index.html index ec3556b8..1b3c153e 100644 --- a/docs/docs/2.0.4/getting-started/basics/index.html +++ b/docs/docs/2.0.4/getting-started/basics/index.html @@ -4,14 +4,14 @@ Installation | Oracle Database Metrics Exporter - - + + -
        Version: 2.0.4

        Installation

        +
        Version: 2.0.4

        Installation

        In this section you will find information on running the exporter.

        • In a container runtime like Docker, Podman, etc
        • diff --git a/docs/docs/2.0.4/getting-started/default-metrics/index.html b/docs/docs/2.0.4/getting-started/default-metrics/index.html index 2463dce7..339f892c 100644 --- a/docs/docs/2.0.4/getting-started/default-metrics/index.html +++ b/docs/docs/2.0.4/getting-started/default-metrics/index.html @@ -4,14 +4,14 @@ Default Metrics | Oracle Database Metrics Exporter - - + + -
          Version: 2.0.4

          Default Metrics

          +
          Version: 2.0.4

          Default Metrics

          The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.

          You can find the exporter's metric schema in the Custom Metrics configuration.

          The following metrics are included by default. The values given are a sample for a single database, "db1":

          diff --git a/docs/docs/2.0.4/getting-started/grafana-dashboards/index.html b/docs/docs/2.0.4/getting-started/grafana-dashboards/index.html index dd42b232..fda83c71 100644 --- a/docs/docs/2.0.4/getting-started/grafana-dashboards/index.html +++ b/docs/docs/2.0.4/getting-started/grafana-dashboards/index.html @@ -4,14 +4,14 @@ Grafana Dashboards | Oracle Database Metrics Exporter - - + + -
          Version: 2.0.4

          Grafana Dashboards

          +
          Version: 2.0.4

          Grafana Dashboards

          Sample Grafana dashboards are included with the exporter.

          A sample Grafana dashboard definition is provided in this directory. You can import these dashboards into your Grafana instance, and set it to use the Prometheus datasource that you have defined for the Prometheus instance that is collecting metrics from the exporter.

          The dashboard shows some basic information, as shown below:

          diff --git a/docs/docs/2.0.4/getting-started/kubernetes/index.html b/docs/docs/2.0.4/getting-started/kubernetes/index.html index 96f4da0b..cd980f40 100644 --- a/docs/docs/2.0.4/getting-started/kubernetes/index.html +++ b/docs/docs/2.0.4/getting-started/kubernetes/index.html @@ -4,14 +4,14 @@ Kubernetes | Oracle Database Metrics Exporter - - + + -
          Version: 2.0.4

          Kubernetes

          +
          Version: 2.0.4

          Kubernetes

          You can run the exporter in Kubernetes using provided manifests.

          To run the exporter in Kubernetes, you must complete the following steps. All steps must be completed in the same Kunernetes namespace. The examples below assume you want to use a namespace called exporter, you must change the commands if you wish to use a different namespace.

          Create a secret with credentials for connecting to the Oracle Database

          diff --git a/docs/docs/2.0.4/intro/index.html b/docs/docs/2.0.4/intro/index.html index e99a93ca..77b1ee19 100644 --- a/docs/docs/2.0.4/intro/index.html +++ b/docs/docs/2.0.4/intro/index.html @@ -4,14 +4,14 @@ OpenTelemetry Metrics for Oracle Database | Oracle Database Metrics Exporter - - + + -
          Version: 2.0.4

          OpenTelemetry Metrics for Oracle Database

          +
          Version: 2.0.4

          OpenTelemetry Metrics for Oracle Database

          This project aims to provide observability for the Oracle Database so that users can understand performance and diagnose issues easily across applications and database. Over time, this project will provide not just metrics, but also logging and tracing support, and integration into popular frameworks like Spring Boot. The project aims to deliver functionality to support both cloud and on-premises databases, including those running in Kubernetes and containers.

          Contributions are welcome - please see contributing.

          Oracle Database Dashboard

          diff --git a/docs/docs/2.0.4/releases/changelog/index.html b/docs/docs/2.0.4/releases/changelog/index.html index 9ade301c..121da587 100644 --- a/docs/docs/2.0.4/releases/changelog/index.html +++ b/docs/docs/2.0.4/releases/changelog/index.html @@ -4,14 +4,14 @@ Changelog | Oracle Database Metrics Exporter - - + + -
          Version: 2.0.4

          Release Notes

          +
          Version: 2.0.4

          Release Notes

          List of upcoming and historic changes to the exporter.

          Our current priorities are support for Exadata metrics. We expect to address these in an upcoming release.

          Version 2.0.4, September 8, 2025

          diff --git a/docs/docs/2.0.4/releases/roadmap/index.html b/docs/docs/2.0.4/releases/roadmap/index.html index 5083e8ff..67028833 100644 --- a/docs/docs/2.0.4/releases/roadmap/index.html +++ b/docs/docs/2.0.4/releases/roadmap/index.html @@ -4,14 +4,14 @@ Roadmap | Oracle Database Metrics Exporter - - + + -
          Version: 2.0.4

          Exporter Roadmap

          +
          Version: 2.0.4

          Exporter Roadmap

          Planned and upcoming features for the exporter.

          We welcome input on community-driven features you'd like to see supported. Please open an issue in this repository with your suggestions.

          Currently, we plan to address the following key features:

          diff --git a/docs/docs/2.1.0/advanced/development/index.html b/docs/docs/2.1.0/advanced/development/index.html new file mode 100644 index 00000000..c042882b --- /dev/null +++ b/docs/docs/2.1.0/advanced/development/index.html @@ -0,0 +1,42 @@ + + + + + +Development | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Development

          +

          The exporter is a Go program using the Prometheus SDK.

          +

          External contributions are welcome, see CONTRIBUTING for details.

          +

          The exporter initialization is as follows:

          +
            +
          • Parse flags options and configuration properties
          • +
          • Load the default toml file (default-metrics.toml) and store each metric in a Metric struct
          • +
          • Load the custom toml file (if a custom toml file is given)
          • +
          • Create an Exporter object
          • +
          • Register exporter in prometheus library
          • +
          • Launching a web server to handle incoming requests
          • +
          • Attempt connection to any configured Oracle Database servers
          • +
          +

          These operations are mainly done in the main function.

          +

          After this initialization phase, the exporter will wait for the arrival of a request.

          +

          Each time, it will iterate over the content of the metricsToScrape structure (in the function scrape func (e * Export) scrape (ch chan <- prometheus.Metric)).

          +

          For each element (of Metric type), a call to the ScrapeMetric function will be made which will itself make a call to the ScrapeGenericValues function.

          +

          The ScrapeGenericValues function will read the information from the Metric structure and, depending on the parameters, will generate the metrics to return. In particular, it will use the GeneratePrometheusMetrics function which will make SQL calls to the database.

          +

          Docker/container build

          +

          To build a container image, run the following command:

          +
          make docker
          +

          For ARM:

          +
          make docker-arm
          +

          Building Binaries

          +

          Run build:

          +
          make go-build
          +

          This will create binaries and archives inside the dist folder for the building operating system.

          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/advanced/go-runtime/index.html b/docs/docs/2.1.0/advanced/go-runtime/index.html new file mode 100644 index 00000000..245a3ce6 --- /dev/null +++ b/docs/docs/2.1.0/advanced/go-runtime/index.html @@ -0,0 +1,23 @@ + + + + + +Configuring the Go Runtime | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Exporter Go Runtime

          +

          If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter's usage of memory.

          +

          Under normal circumstances, the exporter process will retain OS memory that was used by the Go garbage collector but is no longer needed, in case it may be needed again in the future, unless the host OS is under memory pressure. The result of this behavior (which is the normal behavior of the Go runtime) is that the resident set size will not decrease until the host OS memory is almost all used. Under most circumstances, this will not cause any issues, but if you are in an environment where you need to conserve memory, the following options are provided:

          +
            +
          • You may set the FREE_INTERVAL environment variable to a Go duration string, e.g., 60s and run the exporter in debug mode by setting the GODEBUG environment variable to a value including madvdontneed=1, e.g., GODEBUG=gctrace=1,madvdontneed=1. The exporter will call the FreeOSMemory() at the specified interval. This tells the Go runtime to attempt to release memory which is no longer needed. Please note that this does not guarantee that the memory will be released to the OS, but over time you should see the RSS shrink sooner than without these settings.
          • +
          • You may set the RESTART_INTERVAL environment variable to a Go duration string, e.g., 10m. The exporter will restart its own process at the specified iterval (by calling the OS exec syscall). As no new process is created, the process identifier (PID) does not change, but the machine code, data, heap, and stack of the process are replaced by those of the new program (source: Wikipedia). This has the side effect of freeing the resident set, so that it will return to its original size.
          • +
          • In addition to these, you may also set GOMAXPROCS, GOGC, and GOMEMLIMIT (see documentation) to further limit the amount of resources that the Go runtime may use.
          • +
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/advanced/older-versions/index.html b/docs/docs/2.1.0/advanced/older-versions/index.html new file mode 100644 index 00000000..182ee831 --- /dev/null +++ b/docs/docs/2.1.0/advanced/older-versions/index.html @@ -0,0 +1,26 @@ + + + + + +Compatibility with Older Database Versions | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Older Database Versions

          +

          In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.

          +

          Known Issues with Older Database Versions

          +

          If you are running an unsupported version of Oracle Database, you may encounter the following issues:

          +
            +
          • Metrics using modern SQL syntax may not work. For compatibility, you can disable or modify these metrics.
          • +
          • The exporter uses a "thick" database client. Ensure your database client libraries are compatible with your database version.
          • +
          +

          Disabling incompatible metrics

          +

          To disable an incompatible metric, either remove that metric from the metrics file or configure the metric so it does not apply the affected database:

          +
          [[metric]]
          context = "process"
          labels = [ "inst_id" ]
          metricsdesc = { count="Gauge metric with count of processes." }
          request = '''
          select inst_id, count(*) as count
          from gv$process
          group by inst_id
          '''
          # Set databases to an empty array to disable the metric entirely,
          # or include only compatible databases in this array.
          databases = []
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/advanced/txeventq/index.html b/docs/docs/2.1.0/advanced/txeventq/index.html new file mode 100644 index 00000000..f9fe09ae --- /dev/null +++ b/docs/docs/2.1.0/advanced/txeventq/index.html @@ -0,0 +1,44 @@ + + + + + +Monitoring TxEventQ | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Monitoring Transactional Event Queues

          +

          Oracle Transactional Event Queues ("TxEventQ") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.

          +

          Access to the real-time broker, producer, and consumer metrics in a single dashboard and receiving alerts for issues allows teams to understand the state of their system.

          +

          The exporter includes a set of metrics for monitoring TxEventQ and a pre-built Grafana dashboard.

          +
          +

          Note: The metrics are written for Oracle Database 21c or later.

          +
          +

          How to create some traffic with PL/SQL

          +

          If you need to create a topic to monitor, you can use these statements to create and start a topic, and create a subscriber:

          +
          declare
          subscriber sys.aq$_agent;
          begin
          -- create the topic
          dbms_aqadm.create_transactional_event_queue(
          queue_name => 'my_topic',
          multiple_consumers => true -- true makes a pub/sub topic
          );

          -- start the topic
          dbms_aqadm.start_queue(
          queue_name => 'my_topic'
          );

          -- create a subscriber
          dbms_aqadm.add_subscriber(
          queue_name => 'my_teq',
          subscriber => sys.aq$_agent(
          'my_subscriber', -- the subscriber name
          null, -- address, only used for notifications
          0 -- protocol
          ),
          rule => 'correlation = ''my_subscriber'''
          );
          end;
          +

          You can produce a message with these commands:

          +
          declare
          enqueue_options dbms_aq.enqueue_options_t;
          message_properties dbms_aq.message_properties_t;
          message_handle raw(16);
          message SYS.AQ$_JMS_TEXT_MESSAGE;
          begin
          -- create the message payload
          message := SYS.AQ$_JMS_TEXT_MESSAGE.construct;
          message.set_text('{"orderid": 12345, "username": "Jessica Smith"}');

          -- set the consumer name
          message_properties.correlation := 'my_subscriber';

          -- enqueue the message
          dbms_aq.enqueue(
          queue_name => 'my_topic',
          enqueue_options => enqueue_options,
          message_properties => message_properties,
          payload => message,
          msgid => message_handle);

          -- commit the transaction
          commit;
          end;
          +

          How to create some traffic with Java (Spring Boot)

          +

          A simple load generator is provided in this directory which you can use to create some traffic so you can experiment with the sample dashboard.

          +

          To run the sample, first update application.yaml with the correct IP address for your database, then start the application as follows:

          +
          mvn spring-boot:run
          +

          The application will create ten queues names TOPIC_0 through TOPIC_9 and randomly produce and consume messages on those queues. The example dashboard shown below was monitoring traffic produced using this application.

          +

          Metrics definitions

          +

          The metrics definitions are provided in this file. You need to provide this file to the exporter, e.g., by adding it to your container image, or creating a Kubernetes config map containing the file and mounting that config map as a volume in your deployment. You also need to set the CUSTOM_METRICS environment variable to the location of this file.

          +

          Additional database permissions

          +

          The database user that the exporter uses to connect to the database will also need additional permissions, which can be granted with these statements. This example assumes the exporter connects with the username "exporter":

          +
          grant execute on dbms_aq to exporter;
          grant execute on dbms_aqadm to exporter;
          grant execute on dbms_aqin to exporter;
          grant execute on dbms_aqjms_internal to exporter;
          grant execute on dbms_teqk to exporter;
          grant execute on DBMS_RESOURCE_MANAGER to exporter;
          grant select_catalog_role to exporter;
          grant select on sys.aq$_queue_shards to exporter;
          grant select on user_queue_partition_assignment_table to exporter;
          +

          Grafana dashboard

          +

          A Grafana dashboard for Transactional Event Queues is provided in this file. This can be imported into your Grafana environment. Choose the Prometheus datasource that is collecting metrics from the exporter.

          +
          +

          Note: You may not see any activity on the dashboard unless there are clients producing and consuming messages from topics.

          +
          +

          The dashboard will look like this:

          +

          Oracle Database Dashboard

          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/category/advanced/index.html b/docs/docs/2.1.0/category/advanced/index.html new file mode 100644 index 00000000..30d1766f --- /dev/null +++ b/docs/docs/2.1.0/category/advanced/index.html @@ -0,0 +1,16 @@ + + + + + +Advanced | Oracle Database Metrics Exporter + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/2.1.0/category/configuration/index.html b/docs/docs/2.1.0/category/configuration/index.html new file mode 100644 index 00000000..f6e7fba2 --- /dev/null +++ b/docs/docs/2.1.0/category/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +Configuration | Oracle Database Metrics Exporter + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/2.1.0/category/getting-started/index.html b/docs/docs/2.1.0/category/getting-started/index.html new file mode 100644 index 00000000..84f17d5b --- /dev/null +++ b/docs/docs/2.1.0/category/getting-started/index.html @@ -0,0 +1,16 @@ + + + + + +Getting Started | Oracle Database Metrics Exporter + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/2.1.0/category/releases/index.html b/docs/docs/2.1.0/category/releases/index.html new file mode 100644 index 00000000..1e8a0c2a --- /dev/null +++ b/docs/docs/2.1.0/category/releases/index.html @@ -0,0 +1,16 @@ + + + + + +Releases | Oracle Database Metrics Exporter + + + + + + + + + + \ No newline at end of file diff --git a/docs/docs/2.1.0/configuration/alert-logs/index.html b/docs/docs/2.1.0/configuration/alert-logs/index.html new file mode 100644 index 00000000..97cc0415 --- /dev/null +++ b/docs/docs/2.1.0/configuration/alert-logs/index.html @@ -0,0 +1,22 @@ + + + + + +Alert Logs | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Alert logs

          +

          Collect export alert logs with a log ingestion tool.

          +

          The exporter exports alert log records as a JSON file suitable for collection by a log ingestion tool like Promtail or FluentBit.

          +

          Alert logging is configured with the following parameters in the exporter config file:

          +
          ParameterDescriptionDefault
          log.destinationLog file path/log/alert.log
          log.intervalInterval to log records15s
          log.disableDisable logging if set to 10
          +

          Example alert log YAML configuration:

          +
          log:
          # Path of log file
          destination: /opt/exporter/alert.log
          # Interval of log updates
          interval: 15s
          ## Set disable to 1 to disable logging
          # disable: 0
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/configuration/azure-vault/index.html b/docs/docs/2.1.0/configuration/azure-vault/index.html new file mode 100644 index 00000000..e1413108 --- /dev/null +++ b/docs/docs/2.1.0/configuration/azure-vault/index.html @@ -0,0 +1,35 @@ + + + + + +Azure Vault | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Azure Vault

          +

          Securely load database credentials from Azure Vault.

          +

          Each database in the config file may be configured to use Azure Vault. To load the database username and/or password from Azure Vault, set the vault.azure property to contain the Azure Vault ID, and secret names for the database username/password:

          +
          databases:
          mydb:
          vault:
          azure:
          id: <VAULT ID>
          usernameSecret: <Secret containing DB username>
          passwordSecret: <Secret containing DB password>
          +

          Authentication

          +

          If you are running the exporter outside Azure, we recommend using application service principal.

          +

          If you are running the exporter inside Azure, we recommend using a managed identity.

          +

          You should set the following additional environment variables to allow the exporter to authenticate to Azure:

          +
            +
          • AZURE_TENANT_ID should be set to your tenant ID
          • +
          • AZURE_CLIENT_ID should be set to the client ID to authenticate to Azure
          • +
          • AZURE_CLIENT_SECRET should be set to the client secret to authenticate to Azure
          • +
          +

          Azure Vault CLI Configuration (without exporter config file)

          +

          If using the default database with CLI parameters, the exporter will read the database username and password from secrets stored in Azure Key Vault if you set these environment variables:

          +
            +
          • AZ_VAULT_ID should be set to the ID of the Azure Key Vault that you wish to use
          • +
          • AZ_VAULT_USERNAME_SECRET should be set to the name of the secret in the Azure Key Vault which contains the database username
          • +
          • AZ_VAULT_PASSWORD_SECRET should be set to the name of the secret in the Azure Key Vault which contains the database password
          • +
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/configuration/config-file/index.html b/docs/docs/2.1.0/configuration/config-file/index.html new file mode 100644 index 00000000..7799008e --- /dev/null +++ b/docs/docs/2.1.0/configuration/config-file/index.html @@ -0,0 +1,27 @@ + + + + + +Exporter Configuration | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Exporter Configuration

          +

          The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.

          +

          The configuration file contains the following options:

          +
          # Example Oracle Database Metrics Exporter Configuration file.
          # Environment variables of the form ${VAR_NAME} will be expanded.
          # If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,
          # "$test$pwd" => "$$test$$pwd"
          # Otherwise, the value will be expanded as an environment variable.

          # Example Oracle Database Metrics Exporter Configuration file.
          # Environment variables of the form ${VAR_NAME} will be expanded.

          databases:
          ## Path on which metrics will be served
          # metricsPath: /metrics
          ## Database connection information for the "default" database.
          default:
          ## Database username
          username: ${DB_USERNAME}
          ## Database password
          password: ${DB_PASSWORD}
          ## Database password file
          ## If specified, will load the database password from a file.
          # passwordFile: ${DB_PASSWORD_FILE}
          ## Database connection url
          url: localhost:1521/freepdb1

          ## Metrics query timeout for this database, in seconds
          queryTimeout: 5

          ## Rely on Oracle Database External Authentication by network or OS
          # externalAuth: false
          ## Database role
          # role: SYSDBA
          ## Path to Oracle Database wallet, if using wallet
          # tnsAdmin: /path/to/database/wallet

          ### Connection settings:
          ### Either the go-sql or Oracle Database connection pool may be used.
          ### To use the Oracle Database connection pool over the go-sql connection pool,
          ### set maxIdleConns to zero and configure the pool* settings.

          ### Connection pooling settings for the go-sql connection pool
          ## Max open connections for this database using go-sql connection pool
          maxOpenConns: 10
          ## Max idle connections for this database using go-sql connection pool
          maxIdleConns: 10

          ### Connection pooling settings for the Oracle Database connection pool
          ## Oracle Database connection pool increment.
          # poolIncrement: 1
          ## Oracle Database Connection pool maximum size
          # poolMaxConnections: 15
          ## Oracle Database Connection pool minimum size
          # poolMinConnections: 15

          ## Arbitrary labels to add to each metric scraped from this database
          # labels:
          # label_name1: label_value1
          # label_name2: label_value2

          metrics:
          ## How often to scrape metrics. If not provided, metrics will be scraped on request.
          # scrapeInterval: 15s
          ## Path to default metrics file.
          default: default-metrics.toml
          ## Paths to any custom metrics files
          custom:
          - custom-metrics-example/custom-metrics.toml

          log:
          # Path of log file
          destination: /opt/alert.log
          # Interval of log updates
          interval: 15s
          ## Set disable to 1 to disable logging
          # disable: 0

          # Optionally configure prometheus webserver
          #web:
          # listenAddresses: [':9161']
          # systemdSocket: true|false
          # configFile: /path/to/webconfigfile
          +

          Scrape on request vs. Scrape on interval

          +

          The metrics exporter has two scraping modes: scrape on request, and scrape on interval. By default, the metrics exporter scrapes metrics on request, when the /metrics endpoint is invoked.

          +

          To scrape metrics on a given interval, set the metrics.scrapeInterval property to a valid interval:

          +
          metrics:
          # Metrics will be scraped every 30s.
          scrapeInterval: 30s
          +

          An individual metric may have its own scrape interval separate from the exporter's scrape interval. See the metric schema for details on configuring per-metric scrape intervals.

          +

          Config file in a container image

          +

          To add your custom config file to a container image, you can layer the base exporter image and include that config:

          +
          FROM container-registry.oracle.com/database/observability-exporter:2.1.0
          COPY my-exporter-config.yaml /
          ENTRYPOINT ["/oracledb_exporter", "--config.file", "/my-exporter-config.yaml"]
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/configuration/custom-metrics/index.html b/docs/docs/2.1.0/configuration/custom-metrics/index.html new file mode 100644 index 00000000..0f81154e --- /dev/null +++ b/docs/docs/2.1.0/configuration/custom-metrics/index.html @@ -0,0 +1,60 @@ + + + + + +Custom Metrics | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Custom Metrics

          +

          The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.

          +

          To specify custom metrics files +exporter, use the metrics configuration in the config file:

          +
          metrics:
          ## How often to scrape metrics. If not provided, metrics will be scraped on request.
          # scrapeInterval: 15s
          ## Path to default metrics file.
          default: default-metrics.toml
          ## Paths to any custom metrics files (TOML or YAML)
          custom:
          - custom-metrics-example/custom-metrics.toml
          +

          You may also use --custom.metrics flag followed by a comma separated list of TOML or YAML files, or export CUSTOM_METRICS variable environment (export CUSTOM_METRICS=my-custom-metrics.toml,my-other-custom-metrics.toml)

          +

          Metric Hot Reload

          +

          The exporter watches for changes in custom metrics. When these files change, the exporter hot reloads the metrics definition, and serves the new metrics on the next scrape.

          +

          Metric Schema

          +

          Metrics files must contain a series of [[metric]] definitions, in TOML, or the equivalent definition in a YAML file. Each metric definition must follow the exporter's metric schema:

          +
          Field NameDescriptionTypeRequiredDefault
          contextMetric context, used to build metric FQNStringYes
          labelsMetric labels, which must match column names in the query. Any column that is not a label will be parsed as a metricArray of StringsNo
          metricsdescMapping between field(s) in the request and comment(s)Dictionary of StringsYes
          metricstypeMapping between field(s) in the request and Prometheus metric typesDictionary of StringsNo
          metricsbucketsSplit histogram metric types into buckets based on value (example)Dictionary of String dictionariesNo
          fieldtoappendField from the request to append to the metric FQN. This field will not be included in the metric labels.StringNo
          requestOracle database query to run for metrics scrapingStringYes
          ignorezeroresultWhether or not an error will be printed if the request does not return any resultsBooleanNofalse
          querytimeoutOracle Database query timeout duration, e.g., 300ms, 0.5hString durationNoValue of query.timeout in seconds
          scrapeintervalCustom metric scrape interval. If the metric was already scraped during the specified interval, a cached value is provided.String durationNo
          databasesArray of databases the metric will be scraped from, using the database name from the exporter config file. If not present, the metric is scraped from all databases. If the databases array is empty (databases = []) the metric will not be scraped, effectively being disabled.Array of StringsNo
          +

          Example Metric Definition

          +

          Here's a simple example of a metric definition:

          +
          [[metric]]
          context = "test"
          request = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"
          metricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }
          +
          +

          NOTE: Do not add a semicolon (;) at the end of the SQL queries.

          +
          +

          This file produce the following entries in the exporter:

          +
          # HELP oracledb_test_value_1 Simple example returning always 1.
          # TYPE oracledb_test_value_1 gauge
          oracledb_test_value_1 1
          # HELP oracledb_test_value_2 Same but returning always 2.
          # TYPE oracledb_test_value_2 gauge
          oracledb_test_value_2 2
          +

          You can also provide labels using labels field. Here's an example providing two metrics, with and without labels:

          +
          [[metric]]
          context = "context_no_label"
          request = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"
          metricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }

          [[metric]]
          context = "context_with_labels"
          labels = [ "label_1", "label_2" ]
          request = "SELECT 1 as value_1, 2 as value_2, 'First label' as label_1, 'Second label' as label_2 FROM DUAL"
          metricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }
          +

          This TOML file produces the following result:

          +
          # HELP oracledb_context_no_label_value_1 Simple example returning always 1.
          # TYPE oracledb_context_no_label_value_1 gauge
          oracledb_context_no_label_value_1 1
          # HELP oracledb_context_no_label_value_2 Same but returning always 2.
          # TYPE oracledb_context_no_label_value_2 gauge
          oracledb_context_no_label_value_2 2
          # HELP oracledb_context_with_labels_value_1 Simple example returning always 1.
          # TYPE oracledb_context_with_labels_value_1 gauge
          oracledb_context_with_labels_value_1{label_1="First label",label_2="Second label"} 1
          # HELP oracledb_context_with_labels_value_2 Same but returning always 2.
          # TYPE oracledb_context_with_labels_value_2 gauge
          oracledb_context_with_labels_value_2{label_1="First label",label_2="Second label"} 2
          +

          Last, you can set metric type using metricstype field.

          +
          [[metric]]
          context = "context_with_labels"
          labels = [ "label_1", "label_2" ]
          request = "SELECT 1 as value_1, 2 as value_2, 'First label' as label_1, 'Second label' as label_2 FROM DUAL"
          metricsdesc = { value_1 = "Simple example returning always 1 as counter.", value_2 = "Same but returning always 2 as gauge." }
          # Can be counter or gauge (default)
          metricstype = { value_1 = "counter" }
          +

          This TOML file will produce the following result:

          +
          # HELP oracledb_test_value_1 Simple test example returning always 1 as counter.
          # TYPE oracledb_test_value_1 counter
          oracledb_test_value_1 1
          # HELP oracledb_test_value_2 Same test but returning always 2 as gauge.
          # TYPE oracledb_test_value_2 gauge
          oracledb_test_value_2 2
          +

          You can find working examples of custom metrics for slow queries, big queries and top 100 tables. +An example of custom metrics for Transacational Event Queues is also provided.

          +

          Override Existing, Individual Metrics

          +

          You may override properties for existing metrics by supplying a new, custom metric definition with the same context and metricsdesc values. For example, if you have an existing metric like so:

          +
          [[metric]]
          context = "my_default_metric"
          metricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }
          request = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"
          +

          You can redefine this metric in a custom metrics file to change any properties other than context or metricsdesc. For example, overriding the previous metric with labels, scrapeinterval, and querytimeout properties:

          +
          [[metric]]
          context = "my_default_metric"
          metricsdesc = { value_1 = "Simple example returning always 1.", value_2 = "Same but returning always 2." }
          labels = [ "label_1", "label_2" ]
          request = "SELECT 1 as value_1, 2 as value_2 FROM DUAL"
          scrapeinterval = "30s"
          querytimeout = "10s"
          +

          Then, provide any metrics overrides as custom metrics files in the exporter configuration file:

          +
          metrics:
          ## Paths to any custom metrics files
          custom:
          - my-custom-metrics.toml
          +

          If any metric appears more than once in the custom metrics file list, the metric definition in the last file provided takes precedence.

          +

          YAML Metrics

          +

          Metrics may be defined with YAML instead of TOML. YAML metric field names correspond to TOML metric field names.

          +

          YAML metrics are defined as a list of metrics objects:

          +
          metrics:
          - context: "sessions"
          labels: [ "inst_id", "status", "type" ]
          metricsdesc:
          value: "Gauge metric with count of sessions by inst_id, status and type."
          request: |
          select inst_id, status, type, count(*) as value
          from gv$session
          group by inst_id, status, type
          +

          The default metrics are provided in YAML format as an example. See default-metrics.yaml.

          +

          Customize metrics in a container image

          +

          If you run the exporter as a container image and want to include your custom metrics in the image itself, you can use the following example Dockerfile to create a new image:

          +
          FROM container-registry.oracle.com/database/observability-exporter:2.1.0
          COPY custom-metrics.toml /
          ENTRYPOINT ["/oracledb_exporter", "--custom.metrics", "/custom-metrics.toml"]
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/configuration/multiple-databases/index.html b/docs/docs/2.1.0/configuration/multiple-databases/index.html new file mode 100644 index 00000000..52b1072f --- /dev/null +++ b/docs/docs/2.1.0/configuration/multiple-databases/index.html @@ -0,0 +1,28 @@ + + + + + +Multiple Databases | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Scraping Multiple Databases

          +

          The exporter may be configured to scrape as many databases as needed.

          +

          You may scrape as many databases as needed by defining named database configurations in the config file.

          +

          If you're connecting to multiple databases using mTLS, see mTLS for multiple databases with Oracle Wallet

          +

          The following settings configure the exporter to scrape multiple databases, "db1", and "db2", simultaneously:

          +
          # Example Oracle Database Metrics Exporter Configuration file.
          # Environment variables of the form ${VAR_NAME} will be expanded.

          databases:
          ## Path on which metrics will be served
          # metricsPath: /metrics

          ## As many named database configurations may be defined as needed.
          ## It is recommended to define your database config in the config file, rather than using CLI arguments.

          ## Database connection information for the "db1" database.
          db1:
          ## Database username
          username: ${DB1_USERNAME}
          ## Database password
          password: ${DB1_PASSWORD}
          ## Database connection url
          url: localhost:1521/freepdb1

          ## Metrics query timeout for this database, in seconds
          queryTimeout: 5

          ## Rely on Oracle Database External Authentication by network or OS
          # externalAuth: false
          ## Database role
          # role: SYSDBA
          ## Path to Oracle Database wallet, if using wallet
          # tnsAdmin: /path/to/database/wallet

          ### Connection settings:
          ### Either the go-sql or Oracle Database connection pool may be used.
          ### To use the Oracle Database connection pool over the go-sql connection pool,
          ### set maxIdleConns to zero and configure the pool* settings.

          ### Connection pooling settings for the go-sql connection pool
          ## Max open connections for this database using go-sql connection pool
          maxOpenConns: 10
          ## Max idle connections for this database using go-sql connection pool
          maxIdleConns: 10

          ### Connection pooling settings for the Oracle Database connection pool
          ## Oracle Database connection pool increment.
          # poolIncrement: 1
          ## Oracle Database Connection pool maximum size
          # poolMaxConnections: 15
          ## Oracle Database Connection pool minimum size
          # poolMinConnections: 15

          ### Arbitrary labels to add to each metric scraped from this database
          ## Any labels configured for one database will be added to metrics from
          ## every database, because the same metric names must always have the same
          ## full labelset. If the label isn't set for a particular database, then it
          ## will just be set to an empty string.
          # labels:
          # label_name1: label_value1
          # label_name2: label_value2

          db2:
          ## Database username
          username: ${DB2_USERNAME}
          ## Database password
          password: ${DB2_PASSWORD}
          ## Database connection url
          url: localhost:1522/freepdb1

          ## Metrics query timeout for this database, in seconds
          queryTimeout: 5

          ## Rely on Oracle Database External Authentication by network or OS
          # externalAuth: false
          ## Database role
          # role: SYSDBA
          ## Path to Oracle Database wallet, if using wallet
          # tnsAdmin: /path/to/database/wallet

          ### Connection settings:
          ### Either the go-sql or Oracle Database connection pool may be used.
          ### To use the Oracle Database connection pool over the go-sql connection pool,
          ### set maxIdleConns to zero and configure the pool* settings.

          ### Connection pooling settings for the go-sql connection pool
          ## Max open connections for this database using go-sql connection pool
          maxOpenConns: 10
          ## Max idle connections for this database using go-sql connection pool
          maxIdleConns: 10

          ### Connection pooling settings for the Oracle Database connection pool
          ## Oracle Database connection pool increment.
          # poolIncrement: 1
          ## Oracle Database Connection pool maximum size
          # poolMaxConnections: 15
          ## Oracle Database Connection pool minimum size
          # poolMinConnections: 15

          ### Arbitrary labels to add to each metric scraped from this database
          ## Any labels configured for one database will be added to metrics from
          ## every database, because the same metric names must always have the same
          ## full labelset. If the label isn't set for a particular database, then it
          ## will just be set to an empty string.
          # labels:
          # label_name1: label_value1
          # label_name2: label_value2
          +

          Scraping specific metrics from specific databases

          +

          By default, metrics are scraped from every connected database. To expose only certain metrics on specific databases, configure the databases property of a metric. The following metric definition will only be scraped from databases "db2" and "db3":

          +
          [[metric]]
          context = "db_platform"
          labels = [ "platform_name" ]
          metricsdesc = { value = "Database platform" }
          request = '''
          SELECT platform_name, 1 as value FROM gv$database
          '''
          databases = [ "db2", "db3" ]
          +

          If the databases array is empty or not provided for a metric, that metric will be scraped from all connected databases.

          +

          Duplicated database configurations

          +

          If one or more database configurations are "duplicated", that is, using the same URL and username, a WARN message is logged:

          +
          msg="duplicated database connections" "database connections"="db1, db2 count=2
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/configuration/oci-vault/index.html b/docs/docs/2.1.0/configuration/oci-vault/index.html new file mode 100644 index 00000000..2f78d8b0 --- /dev/null +++ b/docs/docs/2.1.0/configuration/oci-vault/index.html @@ -0,0 +1,29 @@ + + + + + +OCI Vault | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Oracle Cloud Infrastructure (OCI) Vault

          +

          Securely load database credentials from OCI Vault.

          +

          Each database in the config file may be configured to use OCI Vault. To load the database username and/or password from OCI Vault, set the vault.oci property to contain the OCI Vault OCID, and secret names for the database username/password:

          +
          databases:
          mydb:
          vault:
          oci:
          id: <VAULT OCID>
          usernameSecret: <Secret containing DB username>
          passwordSecret: <Secret containing DB password>
          +

          OCI Vault CLI Configuration

          +

          If using the default database with CLI parameters, the exporter will read the username and password from a secret stored in OCI Vault if you set these two environment variables:

          +
            +
          • OCI_VAULT_ID should be set to the OCID of the OCI vault that you wish to use
          • +
          • OCI_VAULT_USERNAME_SECRET should be set to the name of the secret in the OCI vault which contains the database username
          • +
          • OCI_VAULT_PASSWORD_SECRET should be set to the name of the secret in the OCI vault which contains the database password
          • +
          +
          +

          Note that the process must be running under a user that has the OCI CLI installed and configured correctly to access the desired tenancy and region. The OCI Profile used is DEFAULT.

          +
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/configuration/oracle-wallet/index.html b/docs/docs/2.1.0/configuration/oracle-wallet/index.html new file mode 100644 index 00000000..ddf50b29 --- /dev/null +++ b/docs/docs/2.1.0/configuration/oracle-wallet/index.html @@ -0,0 +1,57 @@ + + + + + +Oracle Wallet (mTLS) | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Using a Wallet

          +

          For mutual TLS (mTLS) connections, you must use an Oracle Wallet.

          +

          If you are using Oracle Autonomous Database with mTLS, for example, you can download and unzip the wallet from the Oracle Cloud Infrastructure (OCI) console.

          +

          To configure the exporter to use an Oracle Wallet,

          +
            +
          1. Set the TNS_ADMIN environment variable to the directory containing the unzipped wallet
          2. +
          3. Configure your database instance with the appropriate database TNS name:
          4. +
          +
          databases:
          mydb:
          username: admin
          password: <REPLACE ME>
          # TNS Name from wallet tnsnames.ora file, e.g., mydb_high
          url: <TNS Name>
          +

          If you are running the exporter as a container, you can mount the wallet as a volume. For example, mounting the ./wallet directory to the /wallet location:

          +
          docker run -it --rm \
          -e DB_USERNAME=pdbadmin \
          -e DB_PASSWORD=Welcome12345 \
          -e DB_CONNECT_STRING=devdb_tp \
          -v ./wallet:/wallet \
          -p 9161:9161 \
          container-registry.oracle.com/database/observability-exporter:2.1.0
          +

          mTLS for multiple databases with Oracle Wallet

          +

          The Oracle Database Metrics exporter uses ODPI-C, which can only initalize the TNS aliases from a tnsnames.ora file once per process. To work around this, the exporter can be configured to read from a "combined" tnsnames.ora file containing all TNS aliases for connections in a multi-database configuration.

          +
            +
          1. +

            For each database the exporter will connect to, download the corresponding wallet files. If you're using ADB/ATP-S, download the regional wallet instead of the instance wallet if the databases are in the same region.

            +
          2. +
          3. +

            Copy the TNS aliases the tnsnames.ora file from each wallet, and combine them into one file, so all your database service names are in one file together

            +
          4. +
          5. +

            In the combined tnsnames.ora file, and add the following snippet to each TNS alias connection string, to tell the client where the wallet directory is:

            +
          6. +
          +
          (security=(MY_WALLET_DIRECTORY=/path/to/this/database/wallet))
          +

          The combined tnsnames.ora file, which contains the TNS aliases for both databases, and their corresponding wallet location in the security configuration will look something like the following:

          +
          db1_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db1)(ssl_server_dn_match=yes)))

          db2_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.****.oraclecloud.com))(connect_data=(service_name=****.adb.oraclecloud.com))(security=(MY_WALLET_DIRECTORY=/wallets/db2)(ssl_server_dn_match=yes)))
          +
            +
          1. Take wallet files (cwallet.sso, ewallet.p12, & ewallet.pem) for each database, and place them in separate directories. For example, db1 gets its own directory, db2 gets its own directory, and so forth.
          2. +
          +

          The resulting directory structure should look like the following, with wallet information separate from the combined tnsnames.ora file:

          +
          wallets
          ├── combined
          │ ├── sqlnet.ora
          │ └── tnsnames.ora // Combined tnsnames.ora
          ├── db1
          │ ├── cwallet.sso
          │ ├── ewallet.p12
          │ └── ewallet.pem
          └── db2
          ├── cwallet.sso
          ├── ewallet.p12
          └── ewallet.pem
          +
            +
          1. Set the TNS_ADMIN environment variable where the exporter is running to the directory containing your combined tnsnames.ora file:
          2. +
          +
          export TNS_ADMIN=/wallets/combined
          +
            +
          1. Finally, update the exporter configuration file to include the TNS aliases for all databases you will be connecting to. Ensure your database configuration file does not use the tnsAdmin property, as we are using the global TNS_ADMIN environment variable to point to the combined tnsnames.ora file:
          2. +
          +
          databases:
          db2:
          username: ****
          password: ****
          url: db2_high
          queryTimeout: 5
          maxOpenConns: 10
          maxIdleConns: 10
          db1:
          username: ****
          password: ****
          url: db1_high
          queryTimeout: 5
          maxOpenConns: 10
          maxIdleConns: 10
          +

          Then, run the exporter with the config file:

          +
          ./oracledb_exporter --config.file=my-config-file.yaml
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/getting-started/basics/index.html b/docs/docs/2.1.0/getting-started/basics/index.html new file mode 100644 index 00000000..9ccc9e91 --- /dev/null +++ b/docs/docs/2.1.0/getting-started/basics/index.html @@ -0,0 +1,78 @@ + + + + + +Installation | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Installation

          +

          In this section you will find information on running the exporter.

          + +

          Database Permissions

          +

          For the built-in default metrics, the exporter database database user must have the SELECT_CATALOG_ROLE privilege and/or SELECT permission on the following objects:

          +
          dba_tablespace_usage_metrics
          dba_tablespaces
          gv$system_wait_class
          gv$asm_diskgroup_stat
          gv$datafile
          gv$sysstat
          gv$process
          gv$waitclassmetric
          gv$session
          gv$resource_limit
          gv$parameter
          gv$database
          gv$sqlstats
          gv$sysmetric
          v$diag_alert_ext (for alert logs only)
          +

          Docker, Podman, etc

          +

          You can run the exporter in a local container using a container image from Oracle Container Registry. The container image is available in the "observability-exporter" repository in the "Database" category. No authentication or license presentment/acceptance are required to pull this image from the registry.

          +

          Oracle Database Free

          +

          If you need an Oracle Database to test the exporter, you can use this command to start up an instance of Oracle Database Free which also requires no authentication or license presentment/acceptance to pull the image.

          +
          docker run --name free23ai \
          -d \
          -p 1521:1521 \
          -e ORACLE_PASSWORD=Welcome12345 \
          gvenzl/oracle-free:23.9-slim-faststart
          +

          This will pull the image and start up the database with a listener on port 1521. It will also create a pluggable database (a database container) called "FREEPDB1" and will set the admin passwords to the password you specified on this command.

          +

          You can tail the logs to see when the database is ready to use:

          +
          docker logs -f free23ai

          (look for this message...)
          #########################
          DATABASE IS READY TO USE!
          #########################
          +

          To obtain the IP address of the container, which you will need to connect to the database, use this command. Note: depending on your platform and container runtime, you may be able to access the database at "localhost":

          +
          docker inspect free23ai | grep IPA
          "SecondaryIPAddresses": null,
          "IPAddress": "172.17.0.2",
          "IPAMConfig": null,
          "IPAddress": "172.17.0.2",
          +

          Exporter

          +

          You need to give the exporter the connection details for the Oracle Database that you want it to run against. You can use a simple connection, or a wallet.

          +

          Simple connection

          +

          For a simple connection, you will provide the details using these variables:

          +
            +
          • DB_USERNAME is the database username, e.g., pdbadmin
          • +
          • DB_PASSWORD is the password for that user, e.g., Welcome12345
          • +
          • DB_CONNECT_STRING is the connection string, e.g., free23ai:1521/freepdb
          • +
          • DB_ROLE (Optional) can be set to SYSDBA, SYSOPER, SYSBACKUP, SYSDG, SYSKM, SYSRAC or SYSASM if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run.
          • +
          +

          To run the exporter in a container and expose the port, use a command like this, with the appropriate values for the environment variables:

          +
          docker run -it --rm \
          -e DB_USERNAME=pdbadmin \
          -e DB_PASSWORD=Welcome12345 \
          -e DB_CONNECT_STRING=free23ai:1521/freepdb \
          -p 9161:9161 \
          container-registry.oracle.com/database/observability-exporter:2.1.0
          +

          Standalone Binary

          +

          Pre-compiled versions for Linux, ARM and Darwin 64-bit can be found under releases.

          +

          In order to run, you'll need the Oracle Instant Client Basic for your operating system. Only the basic version is required for the exporter.

          +
          +

          NOTE: If you are running the Standalone binary on a Mac ARM platform you must set the variable DYLD_LIBRARY_PATH to the location of where the instant client installed. For example export DYLD_LIBRARY_PATH=/lib/oracle/instantclient_23_3.

          +
          +

          The following command line arguments (flags) can be passed to the exporter (the --help flag will show the table below).

          +
          Usage of oracledb_exporter:
          --config.file="example-config.yaml"
          File with metrics exporter configuration. (env: CONFIG_FILE)
          --web.telemetry-path="/metrics"
          Path under which to expose metrics. (env: TELEMETRY_PATH)
          --default.metrics="default-metrics.toml"
          File with default metrics in a TOML file. (env: DEFAULT_METRICS)
          --custom.metrics="" Comma separated list of file(s) that contain various custom metrics in a TOML format. (env: CUSTOM_METRICS)
          --query.timeout=5 Query timeout (in seconds). (env: QUERY_TIMEOUT)
          --database.maxIdleConns=0 Number of maximum idle connections in the connection pool. (env: DATABASE_MAXIDLECONNS)
          --database.maxOpenConns=10
          Number of maximum open connections in the connection pool. (env: DATABASE_MAXOPENCONNS)
          --database.poolIncrement=-1
          Connection increment when the connection pool reaches max capacity. (env: DATABASE_POOLINCREMENT)
          --database.poolMaxConnections=-1
          Maximum number of connections in the connection pool. (env: DATABASE_POOLMAXCONNECTIONS)
          --database.poolMinConnections=-1
          Minimum number of connections in the connection pool. (env: DATABASE_POOLMINCONNECTIONS)
          --scrape.interval=0s Interval between each scrape. Default is to scrape on collect requests.
          --log.disable=0 Set to 1 to disable alert logs
          --log.interval=15s Interval between log updates (e.g. 5s).
          --log.destination="/log/alert.log"
          File to output the alert log to. (env: LOG_DESTINATION)
          --web.listen-address=:9161 ...
          Addresses on which to expose metrics and web interface. Repeatable for multiple addresses. Examples: `:9100` or `[::1]:9100` for http, `vsock://:9100` for vsock
          --web.config.file="" Path to configuration file that can enable TLS or authentication. See: https://github.com/prometheus/exporter-toolkit/blob/master/docs/web-configuration.md
          --log.level=info Only log messages with the given severity or above. One of: [debug, info, warn, error]
          --log.format=logfmt Output format of log messages. One of: [logfmt, json]
          --[no-]version Show application version.
          +

          You may provide the connection details using these variables:

          +
            +
          • DB_USERNAME is the database username, e.g., pdbadmin
          • +
          • DB_PASSWORD is the password for that user, e.g., Welcome12345
          • +
          • DB_CONNECT_STRING is the connection string, e.g., localhost:1521/freepdb1
          • +
          • DB_ROLE (Optional) can be set to SYSDBA or SYSOPER if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run.
          • +
          • ORACLE_HOME is the location of the Oracle Instant Client, e.g., /lib/oracle/21/client64/lib.
          • +
          • TNS_ADMIN is the location of your (unzipped) wallet. The DIRECTORY set in the sqlnet.ora file must match the path that it will be mounted on inside the container.
          • +
          +

          The following example puts the logfile in the current location with the filename alert.log and loads the default matrics file (default-metrics,toml) from the current location.

          +

          If you prefer to provide configuration via a config file, you may do so with the --config.file argument. The use of a config file over command line arguments is preferred. If a config file is not provided, the "default" database connection is managed by command line arguments.

          +
          # Example Oracle Database Metrics Exporter Configuration file.
          # Environment variables of the form ${VAR_NAME} will be expanded.
          # If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,
          # "$test$pwd" => "$$test$$pwd"
          # Otherwise, the value will be expanded as an environment variable.

          # Example Oracle Database Metrics Exporter Configuration file.
          # Environment variables of the form ${VAR_NAME} will be expanded.

          databases:
          ## Path on which metrics will be served
          # metricsPath: /metrics
          ## Database connection information for the "default" database.
          default:
          ## Database username
          username: ${DB_USERNAME}
          ## Database password
          password: ${DB_PASSWORD}
          ## Database password file
          ## If specified, will load the database password from a file.
          # passwordFile: ${DB_PASSWORD_FILE}
          ## Database connection url
          url: localhost:1521/freepdb1

          ## Metrics query timeout for this database, in seconds
          queryTimeout: 5

          ## Rely on Oracle Database External Authentication by network or OS
          # externalAuth: false
          ## Database role
          # role: SYSDBA
          ## Path to Oracle Database wallet, if using wallet
          # tnsAdmin: /path/to/database/wallet

          ### Connection settings:
          ### Either the go-sql or Oracle Database connection pool may be used.
          ### To use the Oracle Database connection pool over the go-sql connection pool,
          ### set maxIdleConns to zero and configure the pool* settings.

          ### Connection pooling settings for the go-sql connection pool
          ## Max open connections for this database using go-sql connection pool
          maxOpenConns: 10
          ## Max idle connections for this database using go-sql connection pool
          maxIdleConns: 10

          ### Connection pooling settings for the Oracle Database connection pool
          ## Oracle Database connection pool increment.
          # poolIncrement: 1
          ## Oracle Database Connection pool maximum size
          # poolMaxConnections: 15
          ## Oracle Database Connection pool minimum size
          # poolMinConnections: 15

          ## Arbitrary labels to add to each metric scraped from this database
          # labels:
          # label_name1: label_value1
          # label_name2: label_value2

          metrics:
          ## How often to scrape metrics. If not provided, metrics will be scraped on request.
          # scrapeInterval: 15s
          ## Path to default metrics file.
          default: default-metrics.toml
          ## Paths to any custom metrics files
          custom:
          - custom-metrics-example/custom-metrics.toml

          log:
          # Path of log file
          destination: /opt/alert.log
          # Interval of log updates
          interval: 15s
          ## Set disable to 1 to disable logging
          # disable: 0

          # Optionally configure prometheus webserver
          #web:
          # listenAddresses: [':9161']
          # systemdSocket: true|false
          # configFile: /path/to/webconfigfile
          +

          Docker Compose

          +

          If you would like to set up a test environment with the exporter, you can use the provided "Docker Compose" file in this repository which will start an Oracle Database instance, the exporter, Prometheus and Grafana.

          +
          cd docker-compose
          docker-compose up -d
          +

          The containers will take a short time to start. The first time, the Oracle container might take a few minutes to start while it creates the database instance, but this is a one-time operation, and subequent restarts will be much faster (a few seconds).

          +

          Once the containers are all running, you can access the services using these URLs:

          +
            +
          • Exporter
          • +
          • Prometheus - try a query for "oracle".
          • +
          • Grafana - username is "admin" and password is "grafana". An Oracle Database dashboard is provisioned and configured to use data from the exporter.
          • +
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/getting-started/default-metrics/index.html b/docs/docs/2.1.0/getting-started/default-metrics/index.html new file mode 100644 index 00000000..7a7482ad --- /dev/null +++ b/docs/docs/2.1.0/getting-started/default-metrics/index.html @@ -0,0 +1,20 @@ + + + + + +Default Metrics | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Default Metrics

          +

          The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.

          +

          You can find the exporter's metric schema in the Custom Metrics configuration.

          +

          The following metrics are included by default. The values given are a sample for a single database, "db1":

          +
          # HELP oracledb_activity_execute_count Generic counter metric from gv$sysstat view in Oracle.
          # TYPE oracledb_activity_execute_count gauge
          oracledb_activity_execute_count{database="db1"} 6.212049e+06
          # HELP oracledb_activity_parse_count_total Generic counter metric from gv$sysstat view in Oracle.
          # TYPE oracledb_activity_parse_count_total gauge
          oracledb_activity_parse_count_total{database="db1"} 1.054178e+06
          # HELP oracledb_activity_user_commits Generic counter metric from gv$sysstat view in Oracle.
          # TYPE oracledb_activity_user_commits gauge
          oracledb_activity_user_commits{database="db1"} 86538
          # HELP oracledb_activity_user_rollbacks Generic counter metric from gv$sysstat view in Oracle.
          # TYPE oracledb_activity_user_rollbacks gauge
          oracledb_activity_user_rollbacks{database="db1"} 18
          # HELP oracledb_db_platform_value Database platform
          # TYPE oracledb_db_platform_value gauge
          oracledb_db_platform_value{database="db1",platform_name="Linux OS (AARCH64)"} 1
          # HELP oracledb_db_system_value Database system resources metric
          # TYPE oracledb_db_system_value gauge
          oracledb_db_system_value{database="db1",name="cpu_count"} 2
          oracledb_db_system_value{database="db1",name="pga_aggregate_limit"} 2.147483648e+09
          oracledb_db_system_value{database="db1",name="sga_max_size"} 1.610612736e+09
          # HELP oracledb_dbtype Type of database the exporter is connected to (0=non-CDB, 1=CDB, >1=PDB).
          # TYPE oracledb_dbtype gauge
          oracledb_dbtype{database="db1"} 3
          # HELP oracledb_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which oracledb_exporter was built, and the goos and goarch for the build.
          # TYPE oracledb_exporter_build_info gauge
          oracledb_exporter_build_info{branch="",goarch="arm64",goos="darwin",goversion="go1.24.5",revision="unknown",tags="unknown",version=""} 1
          # HELP oracledb_exporter_last_scrape_duration_seconds Duration of the last scrape of metrics from Oracle DB.
          # TYPE oracledb_exporter_last_scrape_duration_seconds gauge
          oracledb_exporter_last_scrape_duration_seconds 0.05714725
          # HELP oracledb_exporter_last_scrape_error Whether the last scrape of metrics from Oracle DB resulted in an error (1 for error, 0 for success).
          # TYPE oracledb_exporter_last_scrape_error gauge
          oracledb_exporter_last_scrape_error 0
          # HELP oracledb_exporter_scrapes_total Total number of times Oracle DB was scraped for metrics.
          # TYPE oracledb_exporter_scrapes_total counter
          oracledb_exporter_scrapes_total 2
          # HELP oracledb_process_count Gauge metric with count of processes.
          # TYPE oracledb_process_count gauge
          oracledb_process_count{database="db1"} 85
          # HELP oracledb_sessions_value Gauge metric with count of sessions by status and type.
          # TYPE oracledb_sessions_value gauge
          oracledb_sessions_value{database="db1",status="ACTIVE",type="BACKGROUND"} 61
          oracledb_sessions_value{database="db1",status="ACTIVE",type="USER"} 2
          oracledb_sessions_value{database="db1",status="INACTIVE",type="USER"} 19
          # HELP oracledb_tablespace_bytes Generic counter metric of tablespaces bytes in Oracle.
          # TYPE oracledb_tablespace_bytes gauge
          oracledb_tablespace_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.7430784e+08
          oracledb_tablespace_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 3.18963712e+08
          oracledb_tablespace_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 7.340032e+06
          oracledb_tablespace_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 2.1364736e+07
          oracledb_tablespace_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 7.340032e+06
          # HELP oracledb_tablespace_free Generic counter metric of tablespaces free bytes in Oracle.
          # TYPE oracledb_tablespace_free gauge
          oracledb_tablespace_free{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.5289739264e+10
          oracledb_tablespace_free{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.524491264e+10
          oracledb_tablespace_free{database="db1",tablespace="TEMP",type="TEMPORARY"} 1.3631488e+07
          oracledb_tablespace_free{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.518435069952e+13
          oracledb_tablespace_free{database="db1",tablespace="USERS",type="PERMANENT"} 3.4352381952e+10
          # HELP oracledb_tablespace_max_bytes Generic counter metric of tablespaces max bytes in Oracle.
          # TYPE oracledb_tablespace_max_bytes gauge
          oracledb_tablespace_max_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.6064047104e+10
          oracledb_tablespace_max_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.5563876352e+10
          oracledb_tablespace_max_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 2.097152e+07
          oracledb_tablespace_max_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.5184372064256e+13
          oracledb_tablespace_max_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 3.4359721984e+10
          # HELP oracledb_tablespace_used_percent Gauge metric showing as a percentage of how much of the tablespace has been used.
          # TYPE oracledb_tablespace_used_percent gauge
          oracledb_tablespace_used_percent{database="db1",tablespace="SYSAUX",type="PERMANENT"} 1.0179682379262742
          oracledb_tablespace_used_percent{database="db1",tablespace="SYSTEM",type="PERMANENT"} 0.4221113677574824
          oracledb_tablespace_used_percent{database="db1",tablespace="TEMP",type="TEMPORARY"} 0.35
          oracledb_tablespace_used_percent{database="db1",tablespace="UNDOTBS1",type="UNDO"} 6.072223190734319e-05
          oracledb_tablespace_used_percent{database="db1",tablespace="USERS",type="PERMANENT"} 0.021362314873845517
          # HELP oracledb_top_sql_elapsed SQL statement elapsed time running
          # TYPE oracledb_top_sql_elapsed gauge
          oracledb_top_sql_elapsed{database="db1",sql_id="0npm6czzaj44m",sql_text="SELECT idx_objn FROM vecsys.vector$index WHERE JSON_VAL"} 6.118614
          oracledb_top_sql_elapsed{database="db1",sql_id="0sbbcuruzd66f",sql_text="select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null"} 1.538687
          oracledb_top_sql_elapsed{database="db1",sql_id="121ffmrc95v7g",sql_text="select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,"} 2.200984
          oracledb_top_sql_elapsed{database="db1",sql_id="61znfd8fvgha6",sql_text="SELECT new.sql_seq, old.plan_hash_value, sqlset_row(ne"} 2.628263
          oracledb_top_sql_elapsed{database="db1",sql_id="68dw2nt8wtunk",sql_text="select originating_timestamp, module_id, execution_cont"} 2.296924
          oracledb_top_sql_elapsed{database="db1",sql_id="9bd61v53p81sk",sql_text="begin prvt_hdm.auto_execute( :dbid , :inst_num , :end_s"} 1.67611
          oracledb_top_sql_elapsed{database="db1",sql_id="aba13jkkk3fts",sql_text="SELECT idx_objn, json_value(IDX_SPARE2, '$.counter') FR"} 3.010397
          oracledb_top_sql_elapsed{database="db1",sql_id="afcz0dh295hzp",sql_text=" SELECT /*+ first_rows(1) */ sql_id, force_matching_sig"} 2.246092
          oracledb_top_sql_elapsed{database="db1",sql_id="ampw9ddqufjd3",sql_text="begin /*KAPI:capture*/ dbms_auto_index_internal.capture"} 4.102646
          oracledb_top_sql_elapsed{database="db1",sql_id="avzy19hxu6gg4",sql_text="SELECT VALUE(P) FROM TABLE(DBMS_SQLTUNE.SELECT_CURSOR_C"} 2.564301
          oracledb_top_sql_elapsed{database="db1",sql_id="b39m8n96gxk7c",sql_text="call dbms_autotask_prvt.run_autotask ( :0,:1 )"} 4.418653
          oracledb_top_sql_elapsed{database="db1",sql_id="bj9ajtpfh9f41",sql_text=" declare purge_scn "} 6.425015
          oracledb_top_sql_elapsed{database="db1",sql_id="bq819r502v7u2",sql_text="select originating_timestamp, module_id, execution_cont"} 3.676572
          oracledb_top_sql_elapsed{database="db1",sql_id="ddrfu7d7hbkym",sql_text=" select count(1), partition_id "} 1.870379
          oracledb_top_sql_elapsed{database="db1",sql_id="f6w8rqdkx0bnv",sql_text="SELECT * FROM ( SELECT /*+ ordered use_nl(o c cu h) ind"} 1.895947
          # HELP oracledb_up Whether the Oracle database server is up.
          # TYPE oracledb_up gauge
          oracledb_up{database="db1"} 1
          # HELP oracledb_wait_time_administrative counter metric from system_wait_class view in Oracle.
          # TYPE oracledb_wait_time_administrative counter
          oracledb_wait_time_administrative{database="db1"} 0
          # HELP oracledb_wait_time_application counter metric from system_wait_class view in Oracle.
          # TYPE oracledb_wait_time_application counter
          oracledb_wait_time_application{database="db1"} 0.73
          # HELP oracledb_wait_time_commit counter metric from system_wait_class view in Oracle.
          # TYPE oracledb_wait_time_commit counter
          oracledb_wait_time_commit{database="db1"} 0.17
          # HELP oracledb_wait_time_concurrency counter metric from system_wait_class view in Oracle.
          # TYPE oracledb_wait_time_concurrency counter
          oracledb_wait_time_concurrency{database="db1"} 6.8
          # HELP oracledb_wait_time_configuration counter metric from system_wait_class view in Oracle.
          # TYPE oracledb_wait_time_configuration counter
          oracledb_wait_time_configuration{database="db1"} 19.71
          # HELP oracledb_wait_time_network counter metric from system_wait_class view in Oracle.
          # TYPE oracledb_wait_time_network counter
          oracledb_wait_time_network{database="db1"} 0.29
          # HELP oracledb_wait_time_other counter metric from system_wait_class view in Oracle.
          # TYPE oracledb_wait_time_other counter
          oracledb_wait_time_other{database="db1"} 6.02
          # HELP oracledb_wait_time_scheduler counter metric from system_wait_class view in Oracle.
          # TYPE oracledb_wait_time_scheduler counter
          oracledb_wait_time_scheduler{database="db1"} 4.01
          # HELP oracledb_wait_time_system_io counter metric from system_wait_class view in Oracle.
          # TYPE oracledb_wait_time_system_io counter
          oracledb_wait_time_system_io{database="db1"} 0.13
          # HELP oracledb_wait_time_user_io counter metric from system_wait_class view in Oracle.
          # TYPE oracledb_wait_time_user_io counter
          oracledb_wait_time_user_io{database="db1"} 12.38
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/getting-started/grafana-dashboards/index.html b/docs/docs/2.1.0/getting-started/grafana-dashboards/index.html new file mode 100644 index 00000000..5182e86b --- /dev/null +++ b/docs/docs/2.1.0/getting-started/grafana-dashboards/index.html @@ -0,0 +1,20 @@ + + + + + +Grafana Dashboards | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Grafana Dashboards

          +

          Sample Grafana dashboards are included with the exporter.

          +

          A sample Grafana dashboard definition is provided in this directory. You can import these dashboards into your Grafana instance, and set it to use the Prometheus datasource that you have defined for the Prometheus instance that is collecting metrics from the exporter.

          +

          The dashboard shows some basic information, as shown below:

          +

          Oracle Database Dashboard

          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/getting-started/kubernetes/index.html b/docs/docs/2.1.0/getting-started/kubernetes/index.html new file mode 100644 index 00000000..411855e9 --- /dev/null +++ b/docs/docs/2.1.0/getting-started/kubernetes/index.html @@ -0,0 +1,52 @@ + + + + + +Kubernetes | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Kubernetes

          +

          You can run the exporter in Kubernetes using provided manifests.

          +

          To run the exporter in Kubernetes, you must complete the following steps. All steps must be completed in the same Kunernetes namespace. The examples below assume you want to use a namespace called exporter, you must change the commands if you wish to use a different namespace.

          +

          Create a secret with credentials for connecting to the Oracle Database

          +

          Create a secret with the Oracle database user and password that the exporter should use to connect to the database using this command. You must specify the correct user and password for your environment. This example uses pdbadmin as the user and Welcome12345 as the password:

          +
          kubectl create secret generic db-secret \
          --from-literal=username=pdbadmin \
          --from-literal=password=Welcome12345 \
          -n exporter
          + +

          Create a config map with the exporter configuration file (if you are using one) using this command:

          +
          kubectl create cm metrics-exporter-config \
          --from-file=metrics-exporter-config.yaml
          +
          +

          NOTE: It is strongly recommended to migrate to the new config file if you are running version 2.0.0 or later.

          +
          +

          Create a config map for the wallet (optional)

          +

          Create a config map with the wallet (if you are using one) using this command. Run this command in the wallet directory you created earlier.

          +
          kubectl create cm db-metrics-tns-admin \
          --from-file=cwallet.sso \
          --from-file=ewallet.p12 \
          --from-file=ewallet.pem \
          --from-file=keystore.jks \
          --from-file=ojdbc.properties \
          --from-file=sqlnet.ora \
          --from-file=tnsnames.ora \
          --from-file=truststore.jks \
          -n exporter
          +

          Create a config map for your metrics definition file (optional)

          +

          If you have defined any custom metrics, you must create a config map for the metrics definition file. For example, if you created a configuration file called txeventq-metrics.toml, then create the config map with this command:

          +
          kubectl create cm db-metrics-txeventq-exporter-config \
          --from-file=txeventq-metrics.toml \
          -n exporter
          +

          Deploy the Oracle Database Observability exporter

          +

          A sample Kubernetes manifest is provided here. You must edit this file to set the namespace you wish to use, the database connect string to use, and if you have any custom metrics, you will need to uncomment and customize some sections in this file.

          +

          Once you have made the necessary updates, apply the file to your cluster using this command:

          +
          kubectl apply -f metrics-exporter-deployment.yaml
          +

          You can check the deployment was successful and monitor the exporter startup with this command:

          +
          kubectl get pods -n exporter -w
          +

          You can view the exporter's logs with this command:

          +
          kubectl logs -f svc/metrics-exporter -n exporter
          +

          Create a Kubernetes service for the exporter

          +

          Create a Kubernetes service to allow access to the exporter pod(s). A sample Kubernetes manifest is provided here. You may need to customize this file to update the namespace.

          +

          Once you have made any necessary udpates, apply the file to your cluster using this command:

          +
          kubectl apply -f metrics-exporter-service.yaml
          +

          Create a Kubernetes service monitor

          +

          Create a Kubernetes service monitor to tell Prometheus (for example) to collect metrics from the exporter. A sample Kubernetes manifest is provided here. You may need to customize this file to update the namespace.

          +

          Once you have made any necessary udpates, apply the file to your cluster using this command:

          +
          kubectl apply -f metrics-service-monitor.yaml
          +

          Configure a Prometheus target (optional)

          +

          You may need to update your Prometheus configuration to add a target. If so, you can use this example job definition as a guide:

          +
            - job_name: 'oracle-exporter'
          metrics_path: '/metrics'
          scrape_interval: 15s
          scrape_timeout: 10s
          static_configs:
          - targets:
          - metrics-exporter.exporter.svc.cluster.local:9161
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/intro/index.html b/docs/docs/2.1.0/intro/index.html new file mode 100644 index 00000000..9e556330 --- /dev/null +++ b/docs/docs/2.1.0/intro/index.html @@ -0,0 +1,44 @@ + + + + + +OpenTelemetry Metrics for Oracle Database | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          OpenTelemetry Metrics for Oracle Database

          +

          The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.

          +

          The metrics supports monitoring multiple database instances, querying default and custom metrics, and ensures that if one database goes offline for maintenance, the rest stay monitored.

          +

          Over time, this project will provide not just metrics, but also logging and tracing support, and integration into popular frameworks like Spring Boot. The project aims to deliver functionality to support both cloud and on-premises databases, including those running in Kubernetes and containers.

          +

          Contributions are welcome - please see contributing.

          +

          Oracle Database Dashboard

          +

          Main Features

          +

          The exporter supports the following main features

          +
            +
          • Exports Oracle Database metrics in standard OTEL/Prometheus format
          • +
          • Works with on-prem, in the cloud, and in Kubernetes, with single instance, clustered, or Autonomous Oracle Database instances
          • +
          • Authenticate with plaintext, TLS, and Oracle Wallet
          • +
          • Secure credentials with Oracle Cloud Infrastructure (OCI) Vault or Azure Vault
          • +
          • Load metrics from one or more databases using a single exporter instance
          • +
          • Export the Prometheus Alert Log in JSON format for easy ingest by log aggregators
          • +
          • Pre-buit AMD64 and ARM64 images provided
          • +
          • Standard, default metrics included "out of the box"
          • +
          • Easily define custom metrics using YAML or TOML
          • +
          • Define the scrape interval, database query timeout, and other parameters on a per-metric, per-database level
          • +
          • Customize the database connection pool using go-sql, Oracle Database connection pools, and works with Database Resident Connection Pools
          • +
          • Includes a sample Grafana dashboards for inspiration or customization
          • +
          +

          Supported Oracle Database Versions

          +

          The Oracle Database Metrics Exporter natively supports Oracle Database versions 19c and 23ai.

          +

          Acknowledgements

          +

          From the v1.0 release onwards, this project provides a Prometheus exporter for Oracle Database based in part on a Prometheus exporter created by Seth Miller. This project includes changes to comply with various Oracle standards and policies, as well as new features.

          +
          +

          Seth has archived his exporter as of Feb 13, 2025 and added a note encouraging people to check out ours instead. We wanted to extend a huge "Thank You!" to Seth for the work he did on that exporter, and his contributions to the Oracle and open source communities!

          +
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/releases/builds/index.html b/docs/docs/2.1.0/releases/builds/index.html new file mode 100644 index 00000000..2cb5026d --- /dev/null +++ b/docs/docs/2.1.0/releases/builds/index.html @@ -0,0 +1,47 @@ + + + + + +Builds | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Builds

          The Oracle Database Metrics Exporter publishes cross-platform builds for each release.

          +

          Binaries:

          +
            +
          • linux/amd64
          • +
          • linux/arm64
          • +
          • darwin/arm64
          • +
          +

          Container images:

          +
            +
          • linux/amd64
          • +
          • linux/arm64
          • +
          +

          Pre-built binaries

          +

          Download pre-built binaries from the metrics exporter GitHub Releases page.

          +

          linux-amd64, linux-arm64, and darwin-arm64 binaries are included, built using GLIBC 2.39. If you require a specific target architecture or are using an older verison of GLIBC, it's recommended to build the metrics exporter binary yourself.

          +

          Container images

          +
          docker pull container-registry.oracle.com/database/observability-exporter:${VERSION}
          +

          Build the Oracle Database Metrics Exporter

          +

          Follow these steps to build the metrics exporter on a Ubuntu Linux system.

          +

          Install build tools.

          +

          Note that podman and qemu-user-static are only required for container builds.

          +
          sudo apt-get -y install podman qemu-user-static golang gcc-aarch64-linux-gnu
          +

          How to build metrics exporter binaries

          +

          Linux amd64:

          +
          make go-build-linux-amd64
          +

          Linux arm64 (requires gcc-aarch64-linux-gnu):

          +

          bash make go-build-linux-gcc-arm64

          +

          Darwin arm64 (requires MacOS platform compilers):

          +
          make go-build-darwin-arm64
          +

          How to build metrics exporter container images

          +

          Creates multi-arch container builds for linux/amd64 and linux/arm64:

          +
          make podman-build
          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/releases/changelog/index.html b/docs/docs/2.1.0/releases/changelog/index.html new file mode 100644 index 00000000..7cbe6576 --- /dev/null +++ b/docs/docs/2.1.0/releases/changelog/index.html @@ -0,0 +1,288 @@ + + + + + +Changelog | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Release Notes

          +

          List of upcoming and historic changes to the exporter.

          +

          Next, in-development

          +

          Our current priorities to support metrics for advanced database features and use cases, like Exadata, GoldenGate, and views included in the Oracle Diagnostics Pack.

          +

          Version 2.1.0, September 29, 2025

          +
            +
          • Updated project dependencies.
          • +
          • Standardize multi-arch builds and document supported database versions.
          • +
          • The metrics override capability is extended, allowing users to redefine individual existing metrics in custom metrics files. This allows users to modify individual default metrics without wholly replacing the default metrics file.
          • +
          • If the exporter fails to connect to a database due to invalid or locked credentials (ORA-01017 or ORA-28000 errors), that database configuration will be invalidated and the exporter will not attempt to re-establish the database connection. Other databases will continue to be scraped.
          • +
          • Metrics with an empty databases array (databases = []) are now considered disabled, and will not be scraped.
          • +
          • Increased the default query timeout for the top_sql metric to 10 seconds (previously 5 seconds).
          • +
          • Metrics using the scrapeinterval property will no longer be scraped on every request if they have a cached value. This only applies when the metrics exporter is configured to scrape metrics on request, rather than on a global interval.
          • +
          • Metrics using the fieldtoappend property now support labels. The wait_time and activity default metrics use the fieldtoappend property, and now properly display their labels.
          • +
          • Fix wait_time default metric to work with Oracle Database 19c.
          • +
          • Fix an issue where the exporter would unnecessarily scrape metrics with a custom scrape interval.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          + +

          Version 2.0.4, September 8, 2025

          +

          This release includes the following changes:

          +
            +
          • Added WARN logging when database configurations are duplicated in the exporter configuration.
          • +
          • Added INST_ID to gv$ query metrics as a label.
          • +
          • Fixed multiple concurrency bugs when the exporter is connected to multiple databases and using a custom scrape interval.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          + +

          Version 2.0.3, August 27, 2025

          +

          This release includes the following changes:

          +
            +
          • Enable configuration of the prometheus webserver from the config file using the web prefix.
          • +
          • Allow loading of database password(s) from a file.
          • +
          • Fixed a bug where database type (CDB, PDB, etc.) was not reported in certain situations.
          • +
          • Fixed a bug where literal passwords containing the '$' character (in the config file) would be evaluated as environment variables. To use literal passwords with the '$' character, escape the '$' character with a second '$': $test$pwd becomes $$test$$pwd.
          • +
          • Fixed a bug when using metrics.scrapeInterval combined with per-metric scrape intervals that made the available metrics data set inconsistent.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          + +

          Version 2.0.2, June 24, 2025

          +

          This release includes the following changes:

          +
            +
          • Fixed a case-sensitive issue with resource name in the default metrics file.
          • +
          • Add query timeouts to initial database connections, which could cause the exporter to hang in multi-database configurations
          • +
          • Fix an issue where rapidly acquiring connections could cause the exporter to crash. This was more common in multi-database configurations, due to the increased number of connection pools.
          • +
          • Update some third-party dependencies.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          + +

          Version 2.0.1, June 12, 2025

          +

          This release includes the following changes:

          +
            +
          • Use gv$ views instead of v$ views to allow collection of metrics from all instances in a cluster. (In preparation for RAC support).
          • +
          • Update some third-party dependencies.
          • +
          +

          Version 2.0.0, May 27, 2025

          +

          This release includes the following changes:

          +
            +
          • Fixed an issue with scrapeinterval that could cause metrics not to be scraped (#172, #176).
          • +
          • Added configuration through a YAML file, passed using the --config.file command-line argument. Backwards compatibility is maintained for the command-line arguments, through it is recommended to use the configuration file from the 2.0.0 release onward. It is not recommended to use a combination of command-line arguments and the configuration file.
          • +
          • Added support for multiple databases through the configuration file. As many database instances may be specified as needed, which will be scraped concurrently (#89).
          • +
          • Updated provided dashboards.
          • +
          • Updated some third-party dependencies.
          • +
          +

          Version 1.6.1, May 2, 2025

          +

          This release includes the following changes:

          +
            +
          • Updated some third-party dependencies.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          +
            +
          • Deepak A.
          • +
          +

          Version 1.6.0, April 18, 2025

          +

          This release includes the following changes:

          +
            +
          • Added support for Azure Key Vault (#200).
          • +
          • 4Aiur added missing grants for alert log to the demo environment (#207).
          • +
          • Updated some third-party dependencies.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          +
            +
          • Brian, Damian et al.
          • +
          • 4Aiur
          • +
          +

          Version 1.5.5, March 13, 2025

          +

          This release includes the following changes:

          +
            +
          • @VictorErmakov updated the docker-compose sample with connection pool parameters to avoid fast connect cycling (#191).
          • +
          • Update default values for connection pool parameters to use go-sql pooling by default to avoid fast connet cycling.
          • +
          • Updated some third-party dependencies.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          + +

          Version 1.5.4, March 3, 2025

          +

          This release includes the following changes:

          +
            +
          • Based of this recommendation from godror, which relates to the two following items, and in discussion with the ODPI-C team, we have introduced additional parameters to allow you to set connection pool parameters, and have set defaults which will avoid fast connect cycling. It is our expectation that a fix may be produced in the underlying ODPI-C library for the underlying issue. In the mean time, these changes will avoid the conditions under which the error can occur.
          • +
          • Fix malloc error (#177, #181).
          • +
          • Fix intermittent connection issues with ADB-S when exporter is run in a container (#169).
          • +
          • Fix Multiple custom metrics files overwrite one another (#179).
          • +
          • Replace go-kit/log with log/slog, due to upstream changes in prometheus/common.
          • +
          • Add support for additional admin roles, expanding list of options for DB_ROLE to SYSDBA, SYSOPER, SYSBACKUP, SYSDG, SYSKM, SYSRAC and SYSASM (#180).
          • +
          • Updated some third-party dependencies.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          + +

          Thank you to @tgulacsi for changes in godror (https://github.com/godror/godror/issues/361, https://github.com/godror/godror/issues/360), and to @cjbj and @sudarshan12s for support and guidance from ODPI-C (https://github.com/oracle/odpi).

          +

          In this release, we also continued some minor code refactoring.

          +

          Version 1.5.3, January 28, 2025

          +

          Known issue: This release has a known issue that results in the error message malloc(): unsorted double linked list corrupted. +We recommend staying on 1.5.2 until a new release with a fix is available. We hope to have a fix by early March.

          +

          This release includes the following changes:

          +
            +
          • Fix over-zealous supression of errors when ignorezeroresult = true (#168).
          • +
          • When scrapeinterval is set, do first scrape immediately, not after the interval (#166).
          • +
          • Updated some third-party dependencies.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          + +

          In this release, we also started some minor code refactoring.

          +

          Version 1.5.2, December 2, 2024

          +

          This release includes the following changes:

          +
            +
          • Update the metric defintion for tablespace usage to report more accurate temp space usage.
          • +
          • Revert InstantClient to 21c version due to ADB connectivity issue.
          • +
          • Update documentation to explain how to obtain credentials from a wallet.
          • +
          • Fix race condition on err variable in scrape() func (by @valrusu).
          • +
          • Updated some third-party dependencies.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          + +

          Version 1.5.1, October 28, 2024

          +

          This release includes the following changes:

          +
            +
          • Added support for using the TNS_ADMIN environment variable, which fixes an issue when connecting to Autonomous Database instances using TNS name.
          • +
          • Updated InstantClient to 23ai version for amd64 and latest available 19.24 version for arm64.
          • +
          • Fixed an issue with wrong LD_LIBRARY_PATH on some platforms. (#136)
          • +
          • Added documentation and an example of using the scrapeinterval setting to change the interval at which a certain metric is colected.
          • +
          • Added notes to documentation for extra security parameters needed when using a wallet with Podman.
          • +
          • Updated some third-party dependencies.
          • +
          +

          Version 1.5.0, September 26, 2024

          +

          This release includes the following changes:

          +
            +
          • Support for running the exporter on ARM processors (darwin and linux).
          • +
          • Updated some third-party dependencies.
          • +
          • Updated the "test/demo environment" to use newer version of Oracle Database (23.5.0.24.07) and faster startup.
          • +
          +

          Version 1.4.0, September 4, 2024

          +

          This release includes the following changes:

          +
            +
          • Allow multiple custom metrics definition files.
          • +
          • Allow query timeout per-metric.
          • +
          • Allow scrape interval per-metric.
          • +
          • Updated some third-party dependencies.
          • +
          +

          Version 1.3.1, July 22, 2024

          +

          This release includes the following changes:

          +
            +
          • Alert logs can be disabled by setting parameter log.disable to 1.
          • +
          • Alert log exporter will stop if it gets three consecutive failures.
          • +
          • Updated the list of required permissions.
          • +
          • Updated the TxEventQ sample dashboard.
          • +
          • Updated some third-party dependencies.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          + +

          Version 1.3.0, June 7, 2024

          +

          This release includes the following changes:

          +
            +
          • Alert logs can be exported for collection by a log reader like Promtail or FluentBit. Default +output to /log/alert.log in JSON format.
          • +
          • Provide ability to connect as SYSDBA or SYSOPER by setting DB_ROLE.
          • +
          • New default metric is added to report the type of database connected to (CDB or PDB).
          • +
          • New default metrics are added for cache hit ratios.
          • +
          • Default metrics updated to suppress spurious warnings in log.
          • +
          • Wait class metric updated to use a better query.
          • +
          • The sample dashboard is updated to include new metrics.
          • +
          • Fixed a bug which prevented periodic freeing of memory.
          • +
          • Set CLIENT_INFO to a meaningful value.
          • +
          • Update Go toolchain to 1.22.4.
          • +
          • Updated some third-party dependencies.
          • +
          +

          Thank you to the following people for their suggestions and contributions:

          + +

          Version 1.2.1, April 16, 2024

          +

          This release includes the following changes:

          +
            +
          • Accept max idle and open connections settings as parameters.
          • +
          • Updated some third-party dependencies.
          • +
          +

          Version 1.2.0, January 17, 2024

          +

          This release includes the following changes:

          +
            +
          • Introduced a new feature to periodically restart the process if requested.
          • +
          • Introduced a new feature to periodically attempt to free OS memory if requested.
          • +
          • Updated some third-party dependencies.
          • +
          +

          Version 1.1.1, November 28, 2023

          +

          This release just updates some third-party dependencies.

          +

          Version 1.1, October 27, 2023

          +

          This release includes the following changes:

          +
            +
          • The query for the standard metric wait_class has been updated so that it will work in both container databases +and pluggable databases, including in Oracle Autonomous Database instances. Note that this query will not return +any data unless the database instance is under load.
          • +
          • Support for reading the database password from OCI Vault has been added (see details)
          • +
          • Log messages have been improved
          • +
          • Some dependencies have been updated
          • +
          +

          Version 1.0, September 13, 2023

          +

          The first production release, v1.0, includes the following features:

          +
            +
          • A number of standard metrics are exposed,
          • +
          • Users can define custom metrics,
          • +
          • Oracle regularly reviews third-party licenses and scans the code and images, including transitive/recursive dependencies for issues,
          • +
          • Connection to Oracle can be a basic connection or use an Oracle Wallet and TLS - connection to Oracle Autonomous Database is supported,
          • +
          • Metrics for Oracle Transactional Event Queues are also supported,
          • +
          • A Grafana dashboard is provided for Transactional Event Queues, and
          • +
          • A pre-built container image is provided, based on Oracle Linux, and optimized for size and security.
          • +
          +

          Note that this exporter uses a different Oracle Database driver which in turn uses code directly written by Oracle to access the database. This driver does require an Oracle client. In this initial release, the client is bundled into the container image, however we intend to make that optional in order to minimize the image size.

          +

          The interfaces for this version have been kept as close as possible to those of earlier alpha releases in this repository to assist with migration. However, it should be expected that there may be breaking changes in future releases.

          + + \ No newline at end of file diff --git a/docs/docs/2.1.0/releases/roadmap/index.html b/docs/docs/2.1.0/releases/roadmap/index.html new file mode 100644 index 00000000..f8fb6e7f --- /dev/null +++ b/docs/docs/2.1.0/releases/roadmap/index.html @@ -0,0 +1,29 @@ + + + + + +Roadmap | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.1.0

          Exporter Roadmap

          +

          Planned and upcoming features for the exporter.

          +

          We welcome input on community-driven features you'd like to see supported. Please open an issue in this repository with your suggestions.

          +

          Currently, we plan to address the following key features:

          +
            +
          • Provide default Oracle Exadata metrics
          • +
          • Provide default GoldenGate metrics
          • +
          • Enhance database alert logging and alert log metrics
          • +
          • Provide the option to have the Oracle client outside of the container image, e.g., on a shared volume,
          • +
          • Implement the ability to update the configuration dynamically, i.e., without a restart
          • +
          • Implement support for tracing within the database, e.g., using an execution context ID provide by an external caller
          • +
          • Provide additional pre-built Grafana dashboards,
          • +
          • Integration with Spring Observability, e.g., Micrometer
          • +
          + + \ No newline at end of file diff --git a/docs/docs/advanced/development/index.html b/docs/docs/advanced/development/index.html index 960aa674..d4bc7e76 100644 --- a/docs/docs/advanced/development/index.html +++ b/docs/docs/advanced/development/index.html @@ -1,17 +1,17 @@ - + -Development | Oracle Database Metrics Exporter - - +Development | Oracle Database Metrics Exporter + + -
          Version: 2.1.0

          Development

          +
          Version: 2.2.0

          Development

          The exporter is a Go program using the Prometheus SDK.

          External contributions are welcome, see CONTRIBUTING for details.

          The exporter initialization is as follows:

          @@ -37,6 +37,6 @@

          Docker

          Building Binaries

          Run build:

          make go-build
          -

          This will create binaries and archives inside the dist folder for the building operating system.

          +

          This will create binaries and archives inside the dist folder for the building operating system.

          \ No newline at end of file diff --git a/docs/docs/advanced/go-ora/index.html b/docs/docs/advanced/go-ora/index.html new file mode 100644 index 00000000..56857909 --- /dev/null +++ b/docs/docs/advanced/go-ora/index.html @@ -0,0 +1,23 @@ + + + + + +go-ora Driver | Oracle Database Metrics Exporter + + + + + + + +
          Version: 2.2.0

          Using the go-ora database driver

          +

          The Oracle Database Metrics Exporter experimentally supports compiling with the go-ora database driver. By default, the exporter compiles using the godror database driver, which uses CGO execution to invoke Oracle Instant Client. the go-ora driver presents an option for users who want to use a "thin" database client without the Oracle Instant Client and CGO.

          +

          Configuring go-ora

          +

          Because go-ora does not use Oracle Instant Client, it is recommended to provide all connection string options in the database.url property:

          +
          databases:
          go_ora_db:
          username: myuser
          password: ******
          url: my_tnsname?wallet=/path/to/wallet&ssl=1
          +

          Build with go-ora

          +

          To build using go-ora instead of godror, set TAGS=goora CGO_ENABLED=0:

          +
          make go-build TAGS=goora CGO_ENABLED=0
          + + \ No newline at end of file diff --git a/docs/docs/advanced/go-runtime/index.html b/docs/docs/advanced/go-runtime/index.html index bbf6b7c7..59094d94 100644 --- a/docs/docs/advanced/go-runtime/index.html +++ b/docs/docs/advanced/go-runtime/index.html @@ -1,23 +1,23 @@ - + -Configuring the Go Runtime | Oracle Database Metrics Exporter - - +Configuring the Go Runtime | Oracle Database Metrics Exporter + + -
          Version: 2.1.0

          Exporter Go Runtime

          +
          Version: 2.2.0

          Exporter Go Runtime

          If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter's usage of memory.

          Under normal circumstances, the exporter process will retain OS memory that was used by the Go garbage collector but is no longer needed, in case it may be needed again in the future, unless the host OS is under memory pressure. The result of this behavior (which is the normal behavior of the Go runtime) is that the resident set size will not decrease until the host OS memory is almost all used. Under most circumstances, this will not cause any issues, but if you are in an environment where you need to conserve memory, the following options are provided:

          • You may set the FREE_INTERVAL environment variable to a Go duration string, e.g., 60s and run the exporter in debug mode by setting the GODEBUG environment variable to a value including madvdontneed=1, e.g., GODEBUG=gctrace=1,madvdontneed=1. The exporter will call the FreeOSMemory() at the specified interval. This tells the Go runtime to attempt to release memory which is no longer needed. Please note that this does not guarantee that the memory will be released to the OS, but over time you should see the RSS shrink sooner than without these settings.
          • You may set the RESTART_INTERVAL environment variable to a Go duration string, e.g., 10m. The exporter will restart its own process at the specified iterval (by calling the OS exec syscall). As no new process is created, the process identifier (PID) does not change, but the machine code, data, heap, and stack of the process are replaced by those of the new program (source: Wikipedia). This has the side effect of freeing the resident set, so that it will return to its original size.
          • In addition to these, you may also set GOMAXPROCS, GOGC, and GOMEMLIMIT (see documentation) to further limit the amount of resources that the Go runtime may use.
          • -
          +
        \ No newline at end of file diff --git a/docs/docs/advanced/older-versions/index.html b/docs/docs/advanced/older-versions/index.html index ed9e90a8..13d550fb 100644 --- a/docs/docs/advanced/older-versions/index.html +++ b/docs/docs/advanced/older-versions/index.html @@ -1,17 +1,17 @@ - + -Compatibility with Older Database Versions | Oracle Database Metrics Exporter - - +Compatibility with Older Database Versions | Oracle Database Metrics Exporter + + -
        Version: 2.1.0

        Older Database Versions

        +
        Version: 2.2.0

        Older Database Versions

        In general, fixes and features are not provided for older database versions. However, it is possible to configure the Oracle Database Metrics Exporter to scrape older versions of Oracle Database.

        Known Issues with Older Database Versions

        If you are running an unsupported version of Oracle Database, you may encounter the following issues:

        @@ -21,6 +21,6 @@

        Disabling incompatible metrics

        To disable an incompatible metric, either remove that metric from the metrics file or configure the metric so it does not apply the affected database:

        -
        [[metric]]
        context = "process"
        labels = [ "inst_id" ]
        metricsdesc = { count="Gauge metric with count of processes." }
        request = '''
        select inst_id, count(*) as count
        from gv$process
        group by inst_id
        '''
        # Set databases to an empty array to disable the metric entirely,
        # or include only compatible databases in this array.
        databases = []
        +
        [[metric]]
        context = "process"
        labels = [ "inst_id" ]
        metricsdesc = { count="Gauge metric with count of processes." }
        request = '''
        select inst_id, count(*) as count
        from gv$process
        group by inst_id
        '''
        # Set databases to an empty array to disable the metric entirely,
        # or include only compatible databases in this array.
        databases = []
        \ No newline at end of file diff --git a/docs/docs/advanced/txeventq/index.html b/docs/docs/advanced/txeventq/index.html index eafad65c..b8a110b9 100644 --- a/docs/docs/advanced/txeventq/index.html +++ b/docs/docs/advanced/txeventq/index.html @@ -1,17 +1,17 @@ - + -Monitoring TxEventQ | Oracle Database Metrics Exporter - - +Monitoring TxEventQ | Oracle Database Metrics Exporter + + -
        Version: 2.1.0

        Monitoring Transactional Event Queues

        +
        Version: 2.2.0

        Monitoring Transactional Event Queues

        Oracle Transactional Event Queues ("TxEventQ") is a fault-tolerant, scalable, real-time messaging backbone offered by converged Oracle Database that allows you to build an enterprise-class event-driven architectures.

        Access to the real-time broker, producer, and consumer metrics in a single dashboard and receiving alerts for issues allows teams to understand the state of their system.

        The exporter includes a set of metrics for monitoring TxEventQ and a pre-built Grafana dashboard.

        @@ -39,6 +39,6 @@

        Grafana da

        Note: You may not see any activity on the dashboard unless there are clients producing and consuming messages from topics.

        The dashboard will look like this:

        -

        Oracle Database Dashboard

        +

        Oracle Database Dashboard

        \ No newline at end of file diff --git a/docs/docs/category/advanced/index.html b/docs/docs/category/advanced/index.html index c40a1df0..eef4028b 100644 --- a/docs/docs/category/advanced/index.html +++ b/docs/docs/category/advanced/index.html @@ -1,16 +1,16 @@ - + -Advanced | Oracle Database Metrics Exporter - - +Advanced | Oracle Database Metrics Exporter + + - +
        \ No newline at end of file diff --git a/docs/docs/category/configuration/index.html b/docs/docs/category/configuration/index.html index 144136ce..5fc28351 100644 --- a/docs/docs/category/configuration/index.html +++ b/docs/docs/category/configuration/index.html @@ -1,16 +1,16 @@ - + -Configuration | Oracle Database Metrics Exporter - - +Configuration | Oracle Database Metrics Exporter + + - + \ No newline at end of file diff --git a/docs/docs/category/getting-started/index.html b/docs/docs/category/getting-started/index.html index 3344c407..2a3cd16a 100644 --- a/docs/docs/category/getting-started/index.html +++ b/docs/docs/category/getting-started/index.html @@ -1,16 +1,16 @@ - + -Getting Started | Oracle Database Metrics Exporter - - +Getting Started | Oracle Database Metrics Exporter + + - + \ No newline at end of file diff --git a/docs/docs/category/releases/index.html b/docs/docs/category/releases/index.html index bd13d093..baf73097 100644 --- a/docs/docs/category/releases/index.html +++ b/docs/docs/category/releases/index.html @@ -1,16 +1,16 @@ - + -Releases | Oracle Database Metrics Exporter - - +Releases | Oracle Database Metrics Exporter + + - + \ No newline at end of file diff --git a/docs/docs/configuration/alert-logs/index.html b/docs/docs/configuration/alert-logs/index.html index a7e051a8..f242fd9b 100644 --- a/docs/docs/configuration/alert-logs/index.html +++ b/docs/docs/configuration/alert-logs/index.html @@ -1,22 +1,22 @@ - + -Alert Logs | Oracle Database Metrics Exporter - - +Alert Logs | Oracle Database Metrics Exporter + + -
        Version: 2.1.0

        Alert logs

        +
        Version: 2.2.0

        Alert logs

        Collect export alert logs with a log ingestion tool.

        The exporter exports alert log records as a JSON file suitable for collection by a log ingestion tool like Promtail or FluentBit.

        Alert logging is configured with the following parameters in the exporter config file:

        ParameterDescriptionDefault
        log.destinationLog file path/log/alert.log
        log.intervalInterval to log records15s
        log.disableDisable logging if set to 10

        Example alert log YAML configuration:

        -
        log:
        # Path of log file
        destination: /opt/exporter/alert.log
        # Interval of log updates
        interval: 15s
        ## Set disable to 1 to disable logging
        # disable: 0
        +
        log:
        # Path of log file
        destination: /opt/exporter/alert.log
        # Interval of log updates
        interval: 15s
        ## Set disable to 1 to disable logging
        # disable: 0
        \ No newline at end of file diff --git a/docs/docs/configuration/azure-vault/index.html b/docs/docs/configuration/azure-vault/index.html index 049abdc2..f25e20ff 100644 --- a/docs/docs/configuration/azure-vault/index.html +++ b/docs/docs/configuration/azure-vault/index.html @@ -1,17 +1,17 @@ - + -Azure Vault | Oracle Database Metrics Exporter - - +Azure Vault | Oracle Database Metrics Exporter + + -
        Version: 2.1.0

        Azure Vault

        +
        Version: 2.2.0

        Azure Vault

        Securely load database credentials from Azure Vault.

        Each database in the config file may be configured to use Azure Vault. To load the database username and/or password from Azure Vault, set the vault.azure property to contain the Azure Vault ID, and secret names for the database username/password:

        databases:
        mydb:
        vault:
        azure:
        id: <VAULT ID>
        usernameSecret: <Secret containing DB username>
        passwordSecret: <Secret containing DB password>
        @@ -30,6 +30,6 @@

        +
      \ No newline at end of file diff --git a/docs/docs/configuration/config-file/index.html b/docs/docs/configuration/config-file/index.html index 579017c9..29baeb50 100644 --- a/docs/docs/configuration/config-file/index.html +++ b/docs/docs/configuration/config-file/index.html @@ -1,20 +1,21 @@ - + -Exporter Configuration | Oracle Database Metrics Exporter - - +Exporter Configuration | Oracle Database Metrics Exporter + + -
      Version: 2.1.0

      Exporter Configuration

      +
      Version: 2.2.0

      Exporter Configuration

      The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.

      The configuration file contains the following options:

      # Example Oracle Database Metrics Exporter Configuration file.
      # Environment variables of the form ${VAR_NAME} will be expanded.
      # If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,
      # "$test$pwd" => "$$test$$pwd"
      # Otherwise, the value will be expanded as an environment variable.

      # Example Oracle Database Metrics Exporter Configuration file.
      # Environment variables of the form ${VAR_NAME} will be expanded.

      databases:
      ## Path on which metrics will be served
      # metricsPath: /metrics
      ## Database connection information for the "default" database.
      default:
      ## Database username
      username: ${DB_USERNAME}
      ## Database password
      password: ${DB_PASSWORD}
      ## Database password file
      ## If specified, will load the database password from a file.
      # passwordFile: ${DB_PASSWORD_FILE}
      ## Database connection url
      url: localhost:1521/freepdb1

      ## Metrics query timeout for this database, in seconds
      queryTimeout: 5

      ## Rely on Oracle Database External Authentication by network or OS
      # externalAuth: false
      ## Database role
      # role: SYSDBA
      ## Path to Oracle Database wallet, if using wallet
      # tnsAdmin: /path/to/database/wallet

      ### Connection settings:
      ### Either the go-sql or Oracle Database connection pool may be used.
      ### To use the Oracle Database connection pool over the go-sql connection pool,
      ### set maxIdleConns to zero and configure the pool* settings.

      ### Connection pooling settings for the go-sql connection pool
      ## Max open connections for this database using go-sql connection pool
      maxOpenConns: 10
      ## Max idle connections for this database using go-sql connection pool
      maxIdleConns: 10

      ### Connection pooling settings for the Oracle Database connection pool
      ## Oracle Database connection pool increment.
      # poolIncrement: 1
      ## Oracle Database Connection pool maximum size
      # poolMaxConnections: 15
      ## Oracle Database Connection pool minimum size
      # poolMinConnections: 15

      ## Arbitrary labels to add to each metric scraped from this database
      # labels:
      # label_name1: label_value1
      # label_name2: label_value2

      metrics:
      ## How often to scrape metrics. If not provided, metrics will be scraped on request.
      # scrapeInterval: 15s
      ## Path to default metrics file.
      default: default-metrics.toml
      ## Paths to any custom metrics files
      custom:
      - custom-metrics-example/custom-metrics.toml

      log:
      # Path of log file
      destination: /opt/alert.log
      # Interval of log updates
      interval: 15s
      ## Set disable to 1 to disable logging
      # disable: 0

      # Optionally configure prometheus webserver
      #web:
      # listenAddresses: [':9161']
      # systemdSocket: true|false
      # configFile: /path/to/webconfigfile
      +

      From the exporter configuration file, you may optionally load database credentials from OCI Vault, Azure Vault, or HashiCorp Vault..

      Scrape on request vs. Scrape on interval

      The metrics exporter has two scraping modes: scrape on request, and scrape on interval. By default, the metrics exporter scrapes metrics on request, when the /metrics endpoint is invoked.

      To scrape metrics on a given interval, set the metrics.scrapeInterval property to a valid interval:

      @@ -22,6 +23,6 @@

      metric schema for details on configuring per-metric scrape intervals.

      Config file in a container image

      To add your custom config file to a container image, you can layer the base exporter image and include that config:

      -
      FROM container-registry.oracle.com/database/observability-exporter:2.1.0
      COPY my-exporter-config.yaml /
      ENTRYPOINT ["/oracledb_exporter", "--config.file", "/my-exporter-config.yaml"]
      +
      FROM container-registry.oracle.com/database/observability-exporter:2.2.0
      COPY my-exporter-config.yaml /
      ENTRYPOINT ["/oracledb_exporter", "--config.file", "/my-exporter-config.yaml"]
      \ No newline at end of file diff --git a/docs/docs/configuration/custom-metrics/index.html b/docs/docs/configuration/custom-metrics/index.html index 43b04e35..c75371c2 100644 --- a/docs/docs/configuration/custom-metrics/index.html +++ b/docs/docs/configuration/custom-metrics/index.html @@ -1,17 +1,17 @@ - + -Custom Metrics | Oracle Database Metrics Exporter - - +Custom Metrics | Oracle Database Metrics Exporter + + -
      Version: 2.1.0

      Custom Metrics

      +
      Version: 2.2.0

      Custom Metrics

      The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.

      To specify custom metrics files exporter, use the metrics configuration in the config file:

      @@ -55,6 +55,6 @@

      YAML MetricsThe default metrics are provided in YAML format as an example. See default-metrics.yaml.

      Customize metrics in a container image

      If you run the exporter as a container image and want to include your custom metrics in the image itself, you can use the following example Dockerfile to create a new image:

      -
      FROM container-registry.oracle.com/database/observability-exporter:2.1.0
      COPY custom-metrics.toml /
      ENTRYPOINT ["/oracledb_exporter", "--custom.metrics", "/custom-metrics.toml"]
      +
      FROM container-registry.oracle.com/database/observability-exporter:2.2.0
      COPY custom-metrics.toml /
      ENTRYPOINT ["/oracledb_exporter", "--custom.metrics", "/custom-metrics.toml"]
      \ No newline at end of file diff --git a/docs/docs/configuration/hashicorp-vault/index.html b/docs/docs/configuration/hashicorp-vault/index.html new file mode 100644 index 00000000..089614b0 --- /dev/null +++ b/docs/docs/configuration/hashicorp-vault/index.html @@ -0,0 +1,42 @@ + + + + + +HashiCorp Vault | Oracle Database Metrics Exporter + + + + + + + +
      Version: 2.2.0

      HashiCorp Vault

      +

      Securely load database credentials from HashiCorp Vault.

      +

      Each database in the config file may be configured to use HashiCorp Vault. To load the database username and/or password from HashiCorp Vault, set the vault.hashicorp property to contain the following information:

      +
      databases:
      mydb:
      vault:
      hashicorp:
      proxySocket: /var/run/vault/vault.sock
      mountType: "kvv1", "kvv2", "database" or "logical"
      mountName: secret engine mount path
      secretPath: path of the secret or database role name
      usernameAttribute: name of the JSON attribute, where to read the database username, if ommitted defaults to "username"
      passwordAttribute: name of the JSON attribute, where to read the database password, if ommitted defaults to "password"
      +

      Example

      +
      databases:
      mydb:
      vault:
      hashicorp:
      proxySocket: /var/run/vault/vault.sock
      mountType: kvv2
      mountName: dev
      secretPath: oracle/mydb/monitoring
      +

      Dynamic database credentials

      +

      Instead of fixed database credentials Vault also supports dynamic credentials that are created every time application requests them. This +makes sure the credentials always have a short time-to-live and even if they leak, they quickly become invalid.

      +

      Follow Vault documentation on how to set up Oracle database plugin for Vault.

      +

      A few additional notes about connecting exporter to CDB. NB! Below are just example commands, adjust them to fit your environment.

      +

      When setting up connection to CDB, then also need to edit "username_template" parameter, so Vault would create a C## common user for exporter.

      +
      vault write database/config/mydb \
      plugin_name=vault-plugin-database-oracle \
      allowed_roles="mydb_exporter" \
      connection_url='{{username}}/{{password}}@//172.17.0.3:1521/FREE' \
      username_template='{{ printf "C##V_%s_%s_%s_%s" (.DisplayName | truncate 8) (.RoleName | truncate 8) (random 20) (unix_time) | truncate 30 | uppercase | replace "-" "_" | replace "." "_" }}' \
      username='c##vaultadmin' \
      password='vaultadmin'
      +

      Since Vault is creating common users in CDB, it needs to have CREATE/ALTER/DROP USER privileges on all containers. Here is a modification of the documented Vault Oracle plugin admin user privileges.

      +
      GRANT CREATE USER to c##vaultadmin WITH ADMIN OPTION container=all;
      GRANT ALTER USER to c##vaultadmin WITH ADMIN OPTION container=all;
      GRANT DROP USER to c##vaultadmin WITH ADMIN OPTION container=all;
      GRANT CREATE SESSION to c##vaultadmin WITH ADMIN OPTION;
      GRANT SELECT on gv_$session to c##vaultadmin;
      GRANT SELECT on v_$sql to c##vaultadmin;
      GRANT ALTER SYSTEM to c##vaultadmin WITH ADMIN OPTION;
      +

      Create no authentication user in Oracle database, that has actual monitoring privileges.

      +
      CREATE USER c##exporter NO AUTHENTICATION;
      GRANT create session TO c##exporter;
      GRANT all necessary privileges that Exporter needs TO c##exporter;
      +

      Create database role in Vault:

      +
      vault write database/roles/mydb_exporter \
      db_name=mydb \
      creation_statements='CREATE USER {{username}} IDENTIFIED BY "{{password}}"; GRANT CREATE SESSION TO {{username}}; ALTER USER c##exporter GRANT CONNECT THROUGH {{username}};' \
      default_ttl="7d" \
      max_ttl="10d"
      +

      NB! Make sure to restart Exporter before TTL above expires, this will fetch new database credentials. When TTL expires, Vault will drop the dynamically created database users.

      +

      And create database config in Exporter:

      +
      databases:
      mydb:
      vault:
      hashicorp:
      proxySocket: /var/run/vault/vault.sock
      mountType: database
      mountName: database
      secretPath: mydb_exporter
      useAsProxyFor: c##exporter
      +

      Authentication

      +

      In this first version it currently only supports queries via HashiCorp Vault Proxy configured to run on the local host and listening on a Unix socket. Currently also required use_auto_auth_token option to be set. +Will expand the support for other methods in the future.

      +

      Example Vault Proxy configuration snippet:

      +
      listener "unix" {
      address = "/var/run/vault/vault.sock"
      socket_mode = "0660"
      socket_user = "vault"
      socket_group = "vaultaccess"
      tls_disable = true
      }

      api_proxy {
      # This always uses the auto_auth token when communicating with Vault server, even if client does not send a token
      use_auto_auth_token = true
      }
      + + \ No newline at end of file diff --git a/docs/docs/configuration/multiple-databases/index.html b/docs/docs/configuration/multiple-databases/index.html index f2b9eb1d..8411fba7 100644 --- a/docs/docs/configuration/multiple-databases/index.html +++ b/docs/docs/configuration/multiple-databases/index.html @@ -1,17 +1,17 @@ - + -Multiple Databases | Oracle Database Metrics Exporter - - +Multiple Databases | Oracle Database Metrics Exporter + + -
      Version: 2.1.0

      Scraping Multiple Databases

      +
      Version: 2.2.0

      Scraping Multiple Databases

      The exporter may be configured to scrape as many databases as needed.

      You may scrape as many databases as needed by defining named database configurations in the config file.

      If you're connecting to multiple databases using mTLS, see mTLS for multiple databases with Oracle Wallet

      @@ -23,6 +23,6 @@

      Duplicated database configurations

      If one or more database configurations are "duplicated", that is, using the same URL and username, a WARN message is logged:

      -
      msg="duplicated database connections" "database connections"="db1, db2 count=2
      +
      msg="duplicated database connections" "database connections"="db1, db2 count=2
      \ No newline at end of file diff --git a/docs/docs/configuration/oci-vault/index.html b/docs/docs/configuration/oci-vault/index.html index 791bdd11..1639e1cb 100644 --- a/docs/docs/configuration/oci-vault/index.html +++ b/docs/docs/configuration/oci-vault/index.html @@ -1,17 +1,17 @@ - + -OCI Vault | Oracle Database Metrics Exporter - - +OCI Vault | Oracle Database Metrics Exporter + + -
      Version: 2.1.0

      Oracle Cloud Infrastructure (OCI) Vault

      +
      Version: 2.2.0

      Oracle Cloud Infrastructure (OCI) Vault

      Securely load database credentials from OCI Vault.

      Each database in the config file may be configured to use OCI Vault. To load the database username and/or password from OCI Vault, set the vault.oci property to contain the OCI Vault OCID, and secret names for the database username/password:

      databases:
      mydb:
      vault:
      oci:
      id: <VAULT OCID>
      usernameSecret: <Secret containing DB username>
      passwordSecret: <Secret containing DB password>
      @@ -24,6 +24,6 @@

    Note that the process must be running under a user that has the OCI CLI installed and configured correctly to access the desired tenancy and region. The OCI Profile used is DEFAULT.

    -
    +
    \ No newline at end of file diff --git a/docs/docs/configuration/oracle-wallet/index.html b/docs/docs/configuration/oracle-wallet/index.html index 0b363378..b2d71f96 100644 --- a/docs/docs/configuration/oracle-wallet/index.html +++ b/docs/docs/configuration/oracle-wallet/index.html @@ -1,17 +1,17 @@ - + -Oracle Wallet (mTLS) | Oracle Database Metrics Exporter - - +Oracle Wallet (mTLS) | Oracle Database Metrics Exporter + + -
    Version: 2.1.0

    Using a Wallet

    +
    Version: 2.2.0

    Using a Wallet

    For mutual TLS (mTLS) connections, you must use an Oracle Wallet.

    If you are using Oracle Autonomous Database with mTLS, for example, you can download and unzip the wallet from the Oracle Cloud Infrastructure (OCI) console.

    To configure the exporter to use an Oracle Wallet,

    @@ -21,7 +21,7 @@
    databases:
    mydb:
    username: admin
    password: <REPLACE ME>
    # TNS Name from wallet tnsnames.ora file, e.g., mydb_high
    url: <TNS Name>

    If you are running the exporter as a container, you can mount the wallet as a volume. For example, mounting the ./wallet directory to the /wallet location:

    -
    docker run -it --rm \
    -e DB_USERNAME=pdbadmin \
    -e DB_PASSWORD=Welcome12345 \
    -e DB_CONNECT_STRING=devdb_tp \
    -v ./wallet:/wallet \
    -p 9161:9161 \
    container-registry.oracle.com/database/observability-exporter:2.1.0
    +
    docker run -it --rm \
    -e DB_USERNAME=pdbadmin \
    -e DB_PASSWORD=Welcome12345 \
    -e DB_CONNECT_STRING=devdb_tp \
    -v ./wallet:/wallet \
    -p 9161:9161 \
    container-registry.oracle.com/database/observability-exporter:2.2.0

    mTLS for multiple databases with Oracle Wallet

    The Oracle Database Metrics exporter uses ODPI-C, which can only initalize the TNS aliases from a tnsnames.ora file once per process. To work around this, the exporter can be configured to read from a "combined" tnsnames.ora file containing all TNS aliases for connections in a multi-database configuration.

      @@ -52,6 +52,6 @@

      databases:
      db2:
      username: ****
      password: ****
      url: db2_high
      queryTimeout: 5
      maxOpenConns: 10
      maxIdleConns: 10
      db1:
      username: ****
      password: ****
      url: db1_high
      queryTimeout: 5
      maxOpenConns: 10
      maxIdleConns: 10

    Then, run the exporter with the config file:

    -
    ./oracledb_exporter --config.file=my-config-file.yaml
    +
    ./oracledb_exporter --config.file=my-config-file.yaml
    \ No newline at end of file diff --git a/docs/docs/getting-started/basics/index.html b/docs/docs/getting-started/basics/index.html index 44a1837e..c7c99cb1 100644 --- a/docs/docs/getting-started/basics/index.html +++ b/docs/docs/getting-started/basics/index.html @@ -1,17 +1,17 @@ - + -Installation | Oracle Database Metrics Exporter - - +Installation | Oracle Database Metrics Exporter + + -
    Version: 2.1.0

    Installation

    +
    Version: 2.2.0

    Installation

    In this section you will find information on running the exporter.

    • In a container runtime like Docker, Podman, etc
    • @@ -43,7 +43,7 @@

      Simple con
    • DB_ROLE (Optional) can be set to SYSDBA, SYSOPER, SYSBACKUP, SYSDG, SYSKM, SYSRAC or SYSASM if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run.

    To run the exporter in a container and expose the port, use a command like this, with the appropriate values for the environment variables:

    -
    docker run -it --rm \
    -e DB_USERNAME=pdbadmin \
    -e DB_PASSWORD=Welcome12345 \
    -e DB_CONNECT_STRING=free23ai:1521/freepdb \
    -p 9161:9161 \
    container-registry.oracle.com/database/observability-exporter:2.1.0
    +
    docker run -it --rm \
    -e DB_USERNAME=pdbadmin \
    -e DB_PASSWORD=Welcome12345 \
    -e DB_CONNECT_STRING=free23ai:1521/freepdb \
    -p 9161:9161 \
    container-registry.oracle.com/database/observability-exporter:2.2.0

    Standalone Binary

    Pre-compiled versions for Linux, ARM and Darwin 64-bit can be found under releases.

    In order to run, you'll need the Oracle Instant Client Basic for your operating system. Only the basic version is required for the exporter.

    @@ -73,6 +73,6 @@

    Docker Compos
  • Exporter
  • Prometheus - try a query for "oracle".
  • Grafana - username is "admin" and password is "grafana". An Oracle Database dashboard is provisioned and configured to use data from the exporter.
  • -

+
\ No newline at end of file diff --git a/docs/docs/getting-started/default-metrics/index.html b/docs/docs/getting-started/default-metrics/index.html index a93c26fc..c263c451 100644 --- a/docs/docs/getting-started/default-metrics/index.html +++ b/docs/docs/getting-started/default-metrics/index.html @@ -1,20 +1,20 @@ - + -Default Metrics | Oracle Database Metrics Exporter - - +Default Metrics | Oracle Database Metrics Exporter + + -
Version: 2.1.0

Default Metrics

+
Version: 2.2.0

Default Metrics

The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.

You can find the exporter's metric schema in the Custom Metrics configuration.

The following metrics are included by default. The values given are a sample for a single database, "db1":

-
# HELP oracledb_activity_execute_count Generic counter metric from gv$sysstat view in Oracle.
# TYPE oracledb_activity_execute_count gauge
oracledb_activity_execute_count{database="db1"} 6.212049e+06
# HELP oracledb_activity_parse_count_total Generic counter metric from gv$sysstat view in Oracle.
# TYPE oracledb_activity_parse_count_total gauge
oracledb_activity_parse_count_total{database="db1"} 1.054178e+06
# HELP oracledb_activity_user_commits Generic counter metric from gv$sysstat view in Oracle.
# TYPE oracledb_activity_user_commits gauge
oracledb_activity_user_commits{database="db1"} 86538
# HELP oracledb_activity_user_rollbacks Generic counter metric from gv$sysstat view in Oracle.
# TYPE oracledb_activity_user_rollbacks gauge
oracledb_activity_user_rollbacks{database="db1"} 18
# HELP oracledb_db_platform_value Database platform
# TYPE oracledb_db_platform_value gauge
oracledb_db_platform_value{database="db1",platform_name="Linux OS (AARCH64)"} 1
# HELP oracledb_db_system_value Database system resources metric
# TYPE oracledb_db_system_value gauge
oracledb_db_system_value{database="db1",name="cpu_count"} 2
oracledb_db_system_value{database="db1",name="pga_aggregate_limit"} 2.147483648e+09
oracledb_db_system_value{database="db1",name="sga_max_size"} 1.610612736e+09
# HELP oracledb_dbtype Type of database the exporter is connected to (0=non-CDB, 1=CDB, >1=PDB).
# TYPE oracledb_dbtype gauge
oracledb_dbtype{database="db1"} 3
# HELP oracledb_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which oracledb_exporter was built, and the goos and goarch for the build.
# TYPE oracledb_exporter_build_info gauge
oracledb_exporter_build_info{branch="",goarch="arm64",goos="darwin",goversion="go1.24.5",revision="unknown",tags="unknown",version=""} 1
# HELP oracledb_exporter_last_scrape_duration_seconds Duration of the last scrape of metrics from Oracle DB.
# TYPE oracledb_exporter_last_scrape_duration_seconds gauge
oracledb_exporter_last_scrape_duration_seconds 0.05714725
# HELP oracledb_exporter_last_scrape_error Whether the last scrape of metrics from Oracle DB resulted in an error (1 for error, 0 for success).
# TYPE oracledb_exporter_last_scrape_error gauge
oracledb_exporter_last_scrape_error 0
# HELP oracledb_exporter_scrapes_total Total number of times Oracle DB was scraped for metrics.
# TYPE oracledb_exporter_scrapes_total counter
oracledb_exporter_scrapes_total 2
# HELP oracledb_process_count Gauge metric with count of processes.
# TYPE oracledb_process_count gauge
oracledb_process_count{database="db1"} 85
# HELP oracledb_sessions_value Gauge metric with count of sessions by status and type.
# TYPE oracledb_sessions_value gauge
oracledb_sessions_value{database="db1",status="ACTIVE",type="BACKGROUND"} 61
oracledb_sessions_value{database="db1",status="ACTIVE",type="USER"} 2
oracledb_sessions_value{database="db1",status="INACTIVE",type="USER"} 19
# HELP oracledb_tablespace_bytes Generic counter metric of tablespaces bytes in Oracle.
# TYPE oracledb_tablespace_bytes gauge
oracledb_tablespace_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.7430784e+08
oracledb_tablespace_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 3.18963712e+08
oracledb_tablespace_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 7.340032e+06
oracledb_tablespace_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 2.1364736e+07
oracledb_tablespace_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 7.340032e+06
# HELP oracledb_tablespace_free Generic counter metric of tablespaces free bytes in Oracle.
# TYPE oracledb_tablespace_free gauge
oracledb_tablespace_free{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.5289739264e+10
oracledb_tablespace_free{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.524491264e+10
oracledb_tablespace_free{database="db1",tablespace="TEMP",type="TEMPORARY"} 1.3631488e+07
oracledb_tablespace_free{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.518435069952e+13
oracledb_tablespace_free{database="db1",tablespace="USERS",type="PERMANENT"} 3.4352381952e+10
# HELP oracledb_tablespace_max_bytes Generic counter metric of tablespaces max bytes in Oracle.
# TYPE oracledb_tablespace_max_bytes gauge
oracledb_tablespace_max_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.6064047104e+10
oracledb_tablespace_max_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.5563876352e+10
oracledb_tablespace_max_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 2.097152e+07
oracledb_tablespace_max_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.5184372064256e+13
oracledb_tablespace_max_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 3.4359721984e+10
# HELP oracledb_tablespace_used_percent Gauge metric showing as a percentage of how much of the tablespace has been used.
# TYPE oracledb_tablespace_used_percent gauge
oracledb_tablespace_used_percent{database="db1",tablespace="SYSAUX",type="PERMANENT"} 1.0179682379262742
oracledb_tablespace_used_percent{database="db1",tablespace="SYSTEM",type="PERMANENT"} 0.4221113677574824
oracledb_tablespace_used_percent{database="db1",tablespace="TEMP",type="TEMPORARY"} 0.35
oracledb_tablespace_used_percent{database="db1",tablespace="UNDOTBS1",type="UNDO"} 6.072223190734319e-05
oracledb_tablespace_used_percent{database="db1",tablespace="USERS",type="PERMANENT"} 0.021362314873845517
# HELP oracledb_top_sql_elapsed SQL statement elapsed time running
# TYPE oracledb_top_sql_elapsed gauge
oracledb_top_sql_elapsed{database="db1",sql_id="0npm6czzaj44m",sql_text="SELECT idx_objn FROM vecsys.vector$index WHERE JSON_VAL"} 6.118614
oracledb_top_sql_elapsed{database="db1",sql_id="0sbbcuruzd66f",sql_text="select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null"} 1.538687
oracledb_top_sql_elapsed{database="db1",sql_id="121ffmrc95v7g",sql_text="select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,"} 2.200984
oracledb_top_sql_elapsed{database="db1",sql_id="61znfd8fvgha6",sql_text="SELECT new.sql_seq, old.plan_hash_value, sqlset_row(ne"} 2.628263
oracledb_top_sql_elapsed{database="db1",sql_id="68dw2nt8wtunk",sql_text="select originating_timestamp, module_id, execution_cont"} 2.296924
oracledb_top_sql_elapsed{database="db1",sql_id="9bd61v53p81sk",sql_text="begin prvt_hdm.auto_execute( :dbid , :inst_num , :end_s"} 1.67611
oracledb_top_sql_elapsed{database="db1",sql_id="aba13jkkk3fts",sql_text="SELECT idx_objn, json_value(IDX_SPARE2, '$.counter') FR"} 3.010397
oracledb_top_sql_elapsed{database="db1",sql_id="afcz0dh295hzp",sql_text=" SELECT /*+ first_rows(1) */ sql_id, force_matching_sig"} 2.246092
oracledb_top_sql_elapsed{database="db1",sql_id="ampw9ddqufjd3",sql_text="begin /*KAPI:capture*/ dbms_auto_index_internal.capture"} 4.102646
oracledb_top_sql_elapsed{database="db1",sql_id="avzy19hxu6gg4",sql_text="SELECT VALUE(P) FROM TABLE(DBMS_SQLTUNE.SELECT_CURSOR_C"} 2.564301
oracledb_top_sql_elapsed{database="db1",sql_id="b39m8n96gxk7c",sql_text="call dbms_autotask_prvt.run_autotask ( :0,:1 )"} 4.418653
oracledb_top_sql_elapsed{database="db1",sql_id="bj9ajtpfh9f41",sql_text=" declare purge_scn "} 6.425015
oracledb_top_sql_elapsed{database="db1",sql_id="bq819r502v7u2",sql_text="select originating_timestamp, module_id, execution_cont"} 3.676572
oracledb_top_sql_elapsed{database="db1",sql_id="ddrfu7d7hbkym",sql_text=" select count(1), partition_id "} 1.870379
oracledb_top_sql_elapsed{database="db1",sql_id="f6w8rqdkx0bnv",sql_text="SELECT * FROM ( SELECT /*+ ordered use_nl(o c cu h) ind"} 1.895947
# HELP oracledb_up Whether the Oracle database server is up.
# TYPE oracledb_up gauge
oracledb_up{database="db1"} 1
# HELP oracledb_wait_time_administrative counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_administrative counter
oracledb_wait_time_administrative{database="db1"} 0
# HELP oracledb_wait_time_application counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_application counter
oracledb_wait_time_application{database="db1"} 0.73
# HELP oracledb_wait_time_commit counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_commit counter
oracledb_wait_time_commit{database="db1"} 0.17
# HELP oracledb_wait_time_concurrency counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_concurrency counter
oracledb_wait_time_concurrency{database="db1"} 6.8
# HELP oracledb_wait_time_configuration counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_configuration counter
oracledb_wait_time_configuration{database="db1"} 19.71
# HELP oracledb_wait_time_network counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_network counter
oracledb_wait_time_network{database="db1"} 0.29
# HELP oracledb_wait_time_other counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_other counter
oracledb_wait_time_other{database="db1"} 6.02
# HELP oracledb_wait_time_scheduler counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_scheduler counter
oracledb_wait_time_scheduler{database="db1"} 4.01
# HELP oracledb_wait_time_system_io counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_system_io counter
oracledb_wait_time_system_io{database="db1"} 0.13
# HELP oracledb_wait_time_user_io counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_user_io counter
oracledb_wait_time_user_io{database="db1"} 12.38
+
# HELP oracledb_activity_execute_count Generic counter metric from gv$sysstat view in Oracle.
# TYPE oracledb_activity_execute_count gauge
oracledb_activity_execute_count{database="db1"} 6.212049e+06
# HELP oracledb_activity_parse_count_total Generic counter metric from gv$sysstat view in Oracle.
# TYPE oracledb_activity_parse_count_total gauge
oracledb_activity_parse_count_total{database="db1"} 1.054178e+06
# HELP oracledb_activity_user_commits Generic counter metric from gv$sysstat view in Oracle.
# TYPE oracledb_activity_user_commits gauge
oracledb_activity_user_commits{database="db1"} 86538
# HELP oracledb_activity_user_rollbacks Generic counter metric from gv$sysstat view in Oracle.
# TYPE oracledb_activity_user_rollbacks gauge
oracledb_activity_user_rollbacks{database="db1"} 18
# HELP oracledb_db_platform_value Database platform
# TYPE oracledb_db_platform_value gauge
oracledb_db_platform_value{database="db1",platform_name="Linux OS (AARCH64)"} 1
# HELP oracledb_db_system_value Database system resources metric
# TYPE oracledb_db_system_value gauge
oracledb_db_system_value{database="db1",name="cpu_count"} 2
oracledb_db_system_value{database="db1",name="pga_aggregate_limit"} 2.147483648e+09
oracledb_db_system_value{database="db1",name="sga_max_size"} 1.610612736e+09
# HELP oracledb_dbtype Type of database the exporter is connected to (0=non-CDB, 1=CDB, >1=PDB).
# TYPE oracledb_dbtype gauge
oracledb_dbtype{database="db1"} 3
# HELP oracledb_exporter_build_info A metric with a constant '1' value labeled by version, revision, branch, goversion from which oracledb_exporter was built, and the goos and goarch for the build.
# TYPE oracledb_exporter_build_info gauge
oracledb_exporter_build_info{branch="",goarch="arm64",goos="darwin",goversion="go1.24.5",revision="unknown",tags="unknown",version=""} 1
# HELP oracledb_exporter_last_scrape_duration_seconds Duration of the last scrape of metrics from Oracle DB.
# TYPE oracledb_exporter_last_scrape_duration_seconds gauge
oracledb_exporter_last_scrape_duration_seconds 0.05714725
# HELP oracledb_exporter_last_scrape_error Whether the last scrape of metrics from Oracle DB resulted in an error (1 for error, 0 for success).
# TYPE oracledb_exporter_last_scrape_error gauge
oracledb_exporter_last_scrape_error 0
# HELP oracledb_exporter_scrapes_total Total number of times Oracle DB was scraped for metrics.
# TYPE oracledb_exporter_scrapes_total counter
oracledb_exporter_scrapes_total 2
# HELP oracledb_process_count Gauge metric with count of processes.
# TYPE oracledb_process_count gauge
oracledb_process_count{database="db1"} 85
# HELP oracledb_sessions_value Gauge metric with count of sessions by status and type.
# TYPE oracledb_sessions_value gauge
oracledb_sessions_value{database="db1",status="ACTIVE",type="BACKGROUND"} 61
oracledb_sessions_value{database="db1",status="ACTIVE",type="USER"} 2
oracledb_sessions_value{database="db1",status="INACTIVE",type="USER"} 19
# HELP oracledb_tablespace_bytes Generic counter metric of tablespaces bytes in Oracle.
# TYPE oracledb_tablespace_bytes gauge
oracledb_tablespace_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.7430784e+08
oracledb_tablespace_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 3.18963712e+08
oracledb_tablespace_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 7.340032e+06
oracledb_tablespace_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 2.1364736e+07
oracledb_tablespace_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 7.340032e+06
# HELP oracledb_tablespace_free Generic counter metric of tablespaces free bytes in Oracle.
# TYPE oracledb_tablespace_free gauge
oracledb_tablespace_free{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.5289739264e+10
oracledb_tablespace_free{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.524491264e+10
oracledb_tablespace_free{database="db1",tablespace="TEMP",type="TEMPORARY"} 1.3631488e+07
oracledb_tablespace_free{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.518435069952e+13
oracledb_tablespace_free{database="db1",tablespace="USERS",type="PERMANENT"} 3.4352381952e+10
# HELP oracledb_tablespace_max_bytes Generic counter metric of tablespaces max bytes in Oracle.
# TYPE oracledb_tablespace_max_bytes gauge
oracledb_tablespace_max_bytes{database="db1",tablespace="SYSAUX",type="PERMANENT"} 7.6064047104e+10
oracledb_tablespace_max_bytes{database="db1",tablespace="SYSTEM",type="PERMANENT"} 7.5563876352e+10
oracledb_tablespace_max_bytes{database="db1",tablespace="TEMP",type="TEMPORARY"} 2.097152e+07
oracledb_tablespace_max_bytes{database="db1",tablespace="UNDOTBS1",type="UNDO"} 3.5184372064256e+13
oracledb_tablespace_max_bytes{database="db1",tablespace="USERS",type="PERMANENT"} 3.4359721984e+10
# HELP oracledb_tablespace_used_percent Gauge metric showing as a percentage of how much of the tablespace has been used.
# TYPE oracledb_tablespace_used_percent gauge
oracledb_tablespace_used_percent{database="db1",tablespace="SYSAUX",type="PERMANENT"} 1.0179682379262742
oracledb_tablespace_used_percent{database="db1",tablespace="SYSTEM",type="PERMANENT"} 0.4221113677574824
oracledb_tablespace_used_percent{database="db1",tablespace="TEMP",type="TEMPORARY"} 0.35
oracledb_tablespace_used_percent{database="db1",tablespace="UNDOTBS1",type="UNDO"} 6.072223190734319e-05
oracledb_tablespace_used_percent{database="db1",tablespace="USERS",type="PERMANENT"} 0.021362314873845517
# HELP oracledb_top_sql_elapsed SQL statement elapsed time running
# TYPE oracledb_top_sql_elapsed gauge
oracledb_top_sql_elapsed{database="db1",sql_id="0npm6czzaj44m",sql_text="SELECT idx_objn FROM vecsys.vector$index WHERE JSON_VAL"} 6.118614
oracledb_top_sql_elapsed{database="db1",sql_id="0sbbcuruzd66f",sql_text="select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null"} 1.538687
oracledb_top_sql_elapsed{database="db1",sql_id="121ffmrc95v7g",sql_text="select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,"} 2.200984
oracledb_top_sql_elapsed{database="db1",sql_id="61znfd8fvgha6",sql_text="SELECT new.sql_seq, old.plan_hash_value, sqlset_row(ne"} 2.628263
oracledb_top_sql_elapsed{database="db1",sql_id="68dw2nt8wtunk",sql_text="select originating_timestamp, module_id, execution_cont"} 2.296924
oracledb_top_sql_elapsed{database="db1",sql_id="9bd61v53p81sk",sql_text="begin prvt_hdm.auto_execute( :dbid , :inst_num , :end_s"} 1.67611
oracledb_top_sql_elapsed{database="db1",sql_id="aba13jkkk3fts",sql_text="SELECT idx_objn, json_value(IDX_SPARE2, '$.counter') FR"} 3.010397
oracledb_top_sql_elapsed{database="db1",sql_id="afcz0dh295hzp",sql_text=" SELECT /*+ first_rows(1) */ sql_id, force_matching_sig"} 2.246092
oracledb_top_sql_elapsed{database="db1",sql_id="ampw9ddqufjd3",sql_text="begin /*KAPI:capture*/ dbms_auto_index_internal.capture"} 4.102646
oracledb_top_sql_elapsed{database="db1",sql_id="avzy19hxu6gg4",sql_text="SELECT VALUE(P) FROM TABLE(DBMS_SQLTUNE.SELECT_CURSOR_C"} 2.564301
oracledb_top_sql_elapsed{database="db1",sql_id="b39m8n96gxk7c",sql_text="call dbms_autotask_prvt.run_autotask ( :0,:1 )"} 4.418653
oracledb_top_sql_elapsed{database="db1",sql_id="bj9ajtpfh9f41",sql_text=" declare purge_scn "} 6.425015
oracledb_top_sql_elapsed{database="db1",sql_id="bq819r502v7u2",sql_text="select originating_timestamp, module_id, execution_cont"} 3.676572
oracledb_top_sql_elapsed{database="db1",sql_id="ddrfu7d7hbkym",sql_text=" select count(1), partition_id "} 1.870379
oracledb_top_sql_elapsed{database="db1",sql_id="f6w8rqdkx0bnv",sql_text="SELECT * FROM ( SELECT /*+ ordered use_nl(o c cu h) ind"} 1.895947
# HELP oracledb_up Whether the Oracle database server is up.
# TYPE oracledb_up gauge
oracledb_up{database="db1"} 1
# HELP oracledb_wait_time_administrative counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_administrative counter
oracledb_wait_time_administrative{database="db1"} 0
# HELP oracledb_wait_time_application counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_application counter
oracledb_wait_time_application{database="db1"} 0.73
# HELP oracledb_wait_time_commit counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_commit counter
oracledb_wait_time_commit{database="db1"} 0.17
# HELP oracledb_wait_time_concurrency counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_concurrency counter
oracledb_wait_time_concurrency{database="db1"} 6.8
# HELP oracledb_wait_time_configuration counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_configuration counter
oracledb_wait_time_configuration{database="db1"} 19.71
# HELP oracledb_wait_time_network counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_network counter
oracledb_wait_time_network{database="db1"} 0.29
# HELP oracledb_wait_time_other counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_other counter
oracledb_wait_time_other{database="db1"} 6.02
# HELP oracledb_wait_time_scheduler counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_scheduler counter
oracledb_wait_time_scheduler{database="db1"} 4.01
# HELP oracledb_wait_time_system_io counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_system_io counter
oracledb_wait_time_system_io{database="db1"} 0.13
# HELP oracledb_wait_time_user_io counter metric from system_wait_class view in Oracle.
# TYPE oracledb_wait_time_user_io counter
oracledb_wait_time_user_io{database="db1"} 12.38
\ No newline at end of file diff --git a/docs/docs/getting-started/grafana-dashboards/index.html b/docs/docs/getting-started/grafana-dashboards/index.html index de91d8d9..f3509a33 100644 --- a/docs/docs/getting-started/grafana-dashboards/index.html +++ b/docs/docs/getting-started/grafana-dashboards/index.html @@ -1,20 +1,20 @@ - + -Grafana Dashboards | Oracle Database Metrics Exporter - - +Grafana Dashboards | Oracle Database Metrics Exporter + + -
Version: 2.1.0

Grafana Dashboards

+
Version: 2.2.0

Grafana Dashboards

Sample Grafana dashboards are included with the exporter.

A sample Grafana dashboard definition is provided in this directory. You can import these dashboards into your Grafana instance, and set it to use the Prometheus datasource that you have defined for the Prometheus instance that is collecting metrics from the exporter.

The dashboard shows some basic information, as shown below:

-

Oracle Database Dashboard

+

Oracle Database Dashboard

\ No newline at end of file diff --git a/docs/docs/getting-started/kubernetes/index.html b/docs/docs/getting-started/kubernetes/index.html index 88f8df7c..b67fd628 100644 --- a/docs/docs/getting-started/kubernetes/index.html +++ b/docs/docs/getting-started/kubernetes/index.html @@ -1,17 +1,17 @@ - + -Kubernetes | Oracle Database Metrics Exporter - - +Kubernetes | Oracle Database Metrics Exporter + + -
Version: 2.1.0

Kubernetes

+
Version: 2.2.0

Kubernetes

You can run the exporter in Kubernetes using provided manifests.

To run the exporter in Kubernetes, you must complete the following steps. All steps must be completed in the same Kunernetes namespace. The examples below assume you want to use a namespace called exporter, you must change the commands if you wish to use a different namespace.

Create a secret with credentials for connecting to the Oracle Database

@@ -47,6 +47,6 @@

kubectl apply -f metrics-service-monitor.yaml

Configure a Prometheus target (optional)

You may need to update your Prometheus configuration to add a target. If so, you can use this example job definition as a guide:

-
  - job_name: 'oracle-exporter'
metrics_path: '/metrics'
scrape_interval: 15s
scrape_timeout: 10s
static_configs:
- targets:
- metrics-exporter.exporter.svc.cluster.local:9161
+
  - job_name: 'oracle-exporter'
metrics_path: '/metrics'
scrape_interval: 15s
scrape_timeout: 10s
static_configs:
- targets:
- metrics-exporter.exporter.svc.cluster.local:9161
\ No newline at end of file diff --git a/docs/docs/intro/index.html b/docs/docs/intro/index.html index 79d1b907..a3ea6790 100644 --- a/docs/docs/intro/index.html +++ b/docs/docs/intro/index.html @@ -1,17 +1,17 @@ - + -OpenTelemetry Metrics for Oracle Database | Oracle Database Metrics Exporter - - +OpenTelemetry Metrics for Oracle Database | Oracle Database Metrics Exporter + + -
Version: 2.1.0

OpenTelemetry Metrics for Oracle Database

+
Version: 2.2.0

OpenTelemetry Metrics for Oracle Database

The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.

The metrics supports monitoring multiple database instances, querying default and custom metrics, and ensures that if one database goes offline for maintenance, the rest stay monitored.

Over time, this project will provide not just metrics, but also logging and tracing support, and integration into popular frameworks like Spring Boot. The project aims to deliver functionality to support both cloud and on-premises databases, including those running in Kubernetes and containers.

@@ -23,7 +23,7 @@

Main Features<
  • Exports Oracle Database metrics in standard OTEL/Prometheus format
  • Works with on-prem, in the cloud, and in Kubernetes, with single instance, clustered, or Autonomous Oracle Database instances
  • Authenticate with plaintext, TLS, and Oracle Wallet
  • -
  • Secure credentials with Oracle Cloud Infrastructure (OCI) Vault or Azure Vault
  • +
  • Secure credentials with Oracle Cloud Infrastructure (OCI) Vault, Azure Vault, or HashiCorp Vault
  • Load metrics from one or more databases using a single exporter instance
  • Export the Prometheus Alert Log in JSON format for easy ingest by log aggregators
  • Pre-buit AMD64 and ARM64 images provided
  • @@ -39,6 +39,6 @@

    Acknowledge

    From the v1.0 release onwards, this project provides a Prometheus exporter for Oracle Database based in part on a Prometheus exporter created by Seth Miller. This project includes changes to comply with various Oracle standards and policies, as well as new features.

    Seth has archived his exporter as of Feb 13, 2025 and added a note encouraging people to check out ours instead. We wanted to extend a huge "Thank You!" to Seth for the work he did on that exporter, and his contributions to the Oracle and open source communities!

    -

    +
    \ No newline at end of file diff --git a/docs/docs/next/advanced/development/index.html b/docs/docs/next/advanced/development/index.html index 9226b824..dc5117c5 100644 --- a/docs/docs/next/advanced/development/index.html +++ b/docs/docs/next/advanced/development/index.html @@ -4,14 +4,14 @@ Development | Oracle Database Metrics Exporter - - + + -
    Version: Next

    Development

    +
    Version: Next

    Development

    The exporter is a Go program using the Prometheus SDK.

    External contributions are welcome, see CONTRIBUTING for details.

    The exporter initialization is as follows:

    diff --git a/docs/docs/next/advanced/go-ora/index.html b/docs/docs/next/advanced/go-ora/index.html new file mode 100644 index 00000000..161b5ccf --- /dev/null +++ b/docs/docs/next/advanced/go-ora/index.html @@ -0,0 +1,23 @@ + + + + + +go-ora Driver | Oracle Database Metrics Exporter + + + + + + + +
    Version: Next

    Using the go-ora database driver

    +

    The Oracle Database Metrics Exporter experimentally supports compiling with the go-ora database driver. By default, the exporter compiles using the godror database driver, which uses CGO execution to invoke Oracle Instant Client. the go-ora driver presents an option for users who want to use a "thin" database client without the Oracle Instant Client and CGO.

    +

    Configuring go-ora

    +

    Because go-ora does not use Oracle Instant Client, it is recommended to provide all connection string options in the database.url property:

    +
    databases:
    go_ora_db:
    username: myuser
    password: ******
    url: my_tnsname?wallet=/path/to/wallet&ssl=1
    +

    Build with go-ora

    +

    To build using go-ora instead of godror, set TAGS=goora CGO_ENABLED=0:

    +
    make go-build TAGS=goora CGO_ENABLED=0
    + + \ No newline at end of file diff --git a/docs/docs/next/advanced/go-runtime/index.html b/docs/docs/next/advanced/go-runtime/index.html index 910488d9..7a70a110 100644 --- a/docs/docs/next/advanced/go-runtime/index.html +++ b/docs/docs/next/advanced/go-runtime/index.html @@ -4,14 +4,14 @@ Configuring the Go Runtime | Oracle Database Metrics Exporter - - + + -
    Version: Next

    Exporter Go Runtime

    +
    Version: Next

    Exporter Go Runtime

    If you are running in an environment with limited memory, or you are running a large number of exporters, you may want to control the exporter's usage of memory.

    Under normal circumstances, the exporter process will retain OS memory that was used by the Go garbage collector but is no longer needed, in case it may be needed again in the future, unless the host OS is under memory pressure. The result of this behavior (which is the normal behavior of the Go runtime) is that the resident set size will not decrease until the host OS memory is almost all used. Under most circumstances, this will not cause any issues, but if you are in an environment where you need to conserve memory, the following options are provided:

    \ No newline at end of file diff --git a/docs/docs/next/configuration/config-file/index.html b/docs/docs/next/configuration/config-file/index.html index 394d9c48..c214d6f6 100644 --- a/docs/docs/next/configuration/config-file/index.html +++ b/docs/docs/next/configuration/config-file/index.html @@ -4,17 +4,18 @@ Exporter Configuration | Oracle Database Metrics Exporter - - + + -
    Version: Next

    Exporter Configuration

    +
    Version: Next

    Exporter Configuration

    The recommended way to configure the exporter is with the --config.file argument, specifying a YAML configuration file.

    The configuration file contains the following options:

    # Example Oracle Database Metrics Exporter Configuration file.
    # Environment variables of the form ${VAR_NAME} will be expanded.
    # If you include a config value that contains a '$' character, escape that '$' with another '$', e.g.,
    # "$test$pwd" => "$$test$$pwd"
    # Otherwise, the value will be expanded as an environment variable.

    # Example Oracle Database Metrics Exporter Configuration file.
    # Environment variables of the form ${VAR_NAME} will be expanded.

    databases:
    ## Path on which metrics will be served
    # metricsPath: /metrics
    ## Database connection information for the "default" database.
    default:
    ## Database username
    username: ${DB_USERNAME}
    ## Database password
    password: ${DB_PASSWORD}
    ## Database password file
    ## If specified, will load the database password from a file.
    # passwordFile: ${DB_PASSWORD_FILE}
    ## Database connection url
    url: localhost:1521/freepdb1

    ## Metrics query timeout for this database, in seconds
    queryTimeout: 5

    ## Rely on Oracle Database External Authentication by network or OS
    # externalAuth: false
    ## Database role
    # role: SYSDBA
    ## Path to Oracle Database wallet, if using wallet
    # tnsAdmin: /path/to/database/wallet

    ### Connection settings:
    ### Either the go-sql or Oracle Database connection pool may be used.
    ### To use the Oracle Database connection pool over the go-sql connection pool,
    ### set maxIdleConns to zero and configure the pool* settings.

    ### Connection pooling settings for the go-sql connection pool
    ## Max open connections for this database using go-sql connection pool
    maxOpenConns: 10
    ## Max idle connections for this database using go-sql connection pool
    maxIdleConns: 10

    ### Connection pooling settings for the Oracle Database connection pool
    ## Oracle Database connection pool increment.
    # poolIncrement: 1
    ## Oracle Database Connection pool maximum size
    # poolMaxConnections: 15
    ## Oracle Database Connection pool minimum size
    # poolMinConnections: 15

    ## Arbitrary labels to add to each metric scraped from this database
    # labels:
    # label_name1: label_value1
    # label_name2: label_value2

    metrics:
    ## How often to scrape metrics. If not provided, metrics will be scraped on request.
    # scrapeInterval: 15s
    ## Path to default metrics file.
    default: default-metrics.toml
    ## Paths to any custom metrics files
    custom:
    - custom-metrics-example/custom-metrics.toml

    log:
    # Path of log file
    destination: /opt/alert.log
    # Interval of log updates
    interval: 15s
    ## Set disable to 1 to disable logging
    # disable: 0

    # Optionally configure prometheus webserver
    #web:
    # listenAddresses: [':9161']
    # systemdSocket: true|false
    # configFile: /path/to/webconfigfile
    +

    From the exporter configuration file, you may optionally load database credentials from OCI Vault, Azure Vault, or HashiCorp Vault..

    Scrape on request vs. Scrape on interval

    The metrics exporter has two scraping modes: scrape on request, and scrape on interval. By default, the metrics exporter scrapes metrics on request, when the /metrics endpoint is invoked.

    To scrape metrics on a given interval, set the metrics.scrapeInterval property to a valid interval:

    @@ -22,6 +23,6 @@

    metric schema for details on configuring per-metric scrape intervals.

    Config file in a container image

    To add your custom config file to a container image, you can layer the base exporter image and include that config:

    -
    FROM container-registry.oracle.com/database/observability-exporter:2.1.0
    COPY my-exporter-config.yaml /
    ENTRYPOINT ["/oracledb_exporter", "--config.file", "/my-exporter-config.yaml"]
    +
    FROM container-registry.oracle.com/database/observability-exporter:2.2.0
    COPY my-exporter-config.yaml /
    ENTRYPOINT ["/oracledb_exporter", "--config.file", "/my-exporter-config.yaml"]
    \ No newline at end of file diff --git a/docs/docs/next/configuration/custom-metrics/index.html b/docs/docs/next/configuration/custom-metrics/index.html index 94f02238..730e8aa1 100644 --- a/docs/docs/next/configuration/custom-metrics/index.html +++ b/docs/docs/next/configuration/custom-metrics/index.html @@ -4,14 +4,14 @@ Custom Metrics | Oracle Database Metrics Exporter - - + + -
    Version: Next

    Custom Metrics

    +
    Version: Next

    Custom Metrics

    The exporter allows definition of arbitrary custom metrics in one or more TOML or YAML files.

    To specify custom metrics files exporter, use the metrics configuration in the config file:

    @@ -55,6 +55,6 @@

    YAML MetricsThe default metrics are provided in YAML format as an example. See default-metrics.yaml.

    Customize metrics in a container image

    If you run the exporter as a container image and want to include your custom metrics in the image itself, you can use the following example Dockerfile to create a new image:

    -
    FROM container-registry.oracle.com/database/observability-exporter:2.1.0
    COPY custom-metrics.toml /
    ENTRYPOINT ["/oracledb_exporter", "--custom.metrics", "/custom-metrics.toml"]
    +
    FROM container-registry.oracle.com/database/observability-exporter:2.2.0
    COPY custom-metrics.toml /
    ENTRYPOINT ["/oracledb_exporter", "--custom.metrics", "/custom-metrics.toml"]
    \ No newline at end of file diff --git a/docs/docs/next/configuration/hashicorp-vault/index.html b/docs/docs/next/configuration/hashicorp-vault/index.html new file mode 100644 index 00000000..642776dc --- /dev/null +++ b/docs/docs/next/configuration/hashicorp-vault/index.html @@ -0,0 +1,42 @@ + + + + + +HashiCorp Vault | Oracle Database Metrics Exporter + + + + + + + +
    Version: Next

    HashiCorp Vault

    +

    Securely load database credentials from HashiCorp Vault.

    +

    Each database in the config file may be configured to use HashiCorp Vault. To load the database username and/or password from HashiCorp Vault, set the vault.hashicorp property to contain the following information:

    +
    databases:
    mydb:
    vault:
    hashicorp:
    proxySocket: /var/run/vault/vault.sock
    mountType: "kvv1", "kvv2", "database" or "logical"
    mountName: secret engine mount path
    secretPath: path of the secret or database role name
    usernameAttribute: name of the JSON attribute, where to read the database username, if ommitted defaults to "username"
    passwordAttribute: name of the JSON attribute, where to read the database password, if ommitted defaults to "password"
    +

    Example

    +
    databases:
    mydb:
    vault:
    hashicorp:
    proxySocket: /var/run/vault/vault.sock
    mountType: kvv2
    mountName: dev
    secretPath: oracle/mydb/monitoring
    +

    Dynamic database credentials

    +

    Instead of fixed database credentials Vault also supports dynamic credentials that are created every time application requests them. This +makes sure the credentials always have a short time-to-live and even if they leak, they quickly become invalid.

    +

    Follow Vault documentation on how to set up Oracle database plugin for Vault.

    +

    A few additional notes about connecting exporter to CDB. NB! Below are just example commands, adjust them to fit your environment.

    +

    When setting up connection to CDB, then also need to edit "username_template" parameter, so Vault would create a C## common user for exporter.

    +
    vault write database/config/mydb \
    plugin_name=vault-plugin-database-oracle \
    allowed_roles="mydb_exporter" \
    connection_url='{{username}}/{{password}}@//172.17.0.3:1521/FREE' \
    username_template='{{ printf "C##V_%s_%s_%s_%s" (.DisplayName | truncate 8) (.RoleName | truncate 8) (random 20) (unix_time) | truncate 30 | uppercase | replace "-" "_" | replace "." "_" }}' \
    username='c##vaultadmin' \
    password='vaultadmin'
    +

    Since Vault is creating common users in CDB, it needs to have CREATE/ALTER/DROP USER privileges on all containers. Here is a modification of the documented Vault Oracle plugin admin user privileges.

    +
    GRANT CREATE USER to c##vaultadmin WITH ADMIN OPTION container=all;
    GRANT ALTER USER to c##vaultadmin WITH ADMIN OPTION container=all;
    GRANT DROP USER to c##vaultadmin WITH ADMIN OPTION container=all;
    GRANT CREATE SESSION to c##vaultadmin WITH ADMIN OPTION;
    GRANT SELECT on gv_$session to c##vaultadmin;
    GRANT SELECT on v_$sql to c##vaultadmin;
    GRANT ALTER SYSTEM to c##vaultadmin WITH ADMIN OPTION;
    +

    Create no authentication user in Oracle database, that has actual monitoring privileges.

    +
    CREATE USER c##exporter NO AUTHENTICATION;
    GRANT create session TO c##exporter;
    GRANT all necessary privileges that Exporter needs TO c##exporter;
    +

    Create database role in Vault:

    +
    vault write database/roles/mydb_exporter \
    db_name=mydb \
    creation_statements='CREATE USER {{username}} IDENTIFIED BY "{{password}}"; GRANT CREATE SESSION TO {{username}}; ALTER USER c##exporter GRANT CONNECT THROUGH {{username}};' \
    default_ttl="7d" \
    max_ttl="10d"
    +

    NB! Make sure to restart Exporter before TTL above expires, this will fetch new database credentials. When TTL expires, Vault will drop the dynamically created database users.

    +

    And create database config in Exporter:

    +
    databases:
    mydb:
    vault:
    hashicorp:
    proxySocket: /var/run/vault/vault.sock
    mountType: database
    mountName: database
    secretPath: mydb_exporter
    useAsProxyFor: c##exporter
    +

    Authentication

    +

    In this first version it currently only supports queries via HashiCorp Vault Proxy configured to run on the local host and listening on a Unix socket. Currently also required use_auto_auth_token option to be set. +Will expand the support for other methods in the future.

    +

    Example Vault Proxy configuration snippet:

    +
    listener "unix" {
    address = "/var/run/vault/vault.sock"
    socket_mode = "0660"
    socket_user = "vault"
    socket_group = "vaultaccess"
    tls_disable = true
    }

    api_proxy {
    # This always uses the auto_auth token when communicating with Vault server, even if client does not send a token
    use_auto_auth_token = true
    }
    + + \ No newline at end of file diff --git a/docs/docs/next/configuration/multiple-databases/index.html b/docs/docs/next/configuration/multiple-databases/index.html index bd6fe3f0..037de4fb 100644 --- a/docs/docs/next/configuration/multiple-databases/index.html +++ b/docs/docs/next/configuration/multiple-databases/index.html @@ -4,14 +4,14 @@ Multiple Databases | Oracle Database Metrics Exporter - - + + -
    Version: Next

    Scraping Multiple Databases

    +
    Version: Next

    Scraping Multiple Databases

    The exporter may be configured to scrape as many databases as needed.

    You may scrape as many databases as needed by defining named database configurations in the config file.

    If you're connecting to multiple databases using mTLS, see mTLS for multiple databases with Oracle Wallet

    diff --git a/docs/docs/next/configuration/oci-vault/index.html b/docs/docs/next/configuration/oci-vault/index.html index 05582025..f96ab50c 100644 --- a/docs/docs/next/configuration/oci-vault/index.html +++ b/docs/docs/next/configuration/oci-vault/index.html @@ -4,14 +4,14 @@ OCI Vault | Oracle Database Metrics Exporter - - + + -
    Version: Next

    Oracle Cloud Infrastructure (OCI) Vault

    +
    Version: Next

    Oracle Cloud Infrastructure (OCI) Vault

    Securely load database credentials from OCI Vault.

    Each database in the config file may be configured to use OCI Vault. To load the database username and/or password from OCI Vault, set the vault.oci property to contain the OCI Vault OCID, and secret names for the database username/password:

    databases:
    mydb:
    vault:
    oci:
    id: <VAULT OCID>
    usernameSecret: <Secret containing DB username>
    passwordSecret: <Secret containing DB password>
    diff --git a/docs/docs/next/configuration/oracle-wallet/index.html b/docs/docs/next/configuration/oracle-wallet/index.html index 531d9e71..c41e0344 100644 --- a/docs/docs/next/configuration/oracle-wallet/index.html +++ b/docs/docs/next/configuration/oracle-wallet/index.html @@ -4,14 +4,14 @@ Oracle Wallet (mTLS) | Oracle Database Metrics Exporter - - + + -
    Version: Next

    Using a Wallet

    +
    Version: Next

    Using a Wallet

    For mutual TLS (mTLS) connections, you must use an Oracle Wallet.

    If you are using Oracle Autonomous Database with mTLS, for example, you can download and unzip the wallet from the Oracle Cloud Infrastructure (OCI) console.

    To configure the exporter to use an Oracle Wallet,

    @@ -21,7 +21,7 @@
    databases:
    mydb:
    username: admin
    password: <REPLACE ME>
    # TNS Name from wallet tnsnames.ora file, e.g., mydb_high
    url: <TNS Name>

    If you are running the exporter as a container, you can mount the wallet as a volume. For example, mounting the ./wallet directory to the /wallet location:

    -
    docker run -it --rm \
    -e DB_USERNAME=pdbadmin \
    -e DB_PASSWORD=Welcome12345 \
    -e DB_CONNECT_STRING=devdb_tp \
    -v ./wallet:/wallet \
    -p 9161:9161 \
    container-registry.oracle.com/database/observability-exporter:2.1.0
    +
    docker run -it --rm \
    -e DB_USERNAME=pdbadmin \
    -e DB_PASSWORD=Welcome12345 \
    -e DB_CONNECT_STRING=devdb_tp \
    -v ./wallet:/wallet \
    -p 9161:9161 \
    container-registry.oracle.com/database/observability-exporter:2.2.0

    mTLS for multiple databases with Oracle Wallet

    The Oracle Database Metrics exporter uses ODPI-C, which can only initalize the TNS aliases from a tnsnames.ora file once per process. To work around this, the exporter can be configured to read from a "combined" tnsnames.ora file containing all TNS aliases for connections in a multi-database configuration.

      diff --git a/docs/docs/next/getting-started/basics/index.html b/docs/docs/next/getting-started/basics/index.html index 6462b8b3..006a3569 100644 --- a/docs/docs/next/getting-started/basics/index.html +++ b/docs/docs/next/getting-started/basics/index.html @@ -4,14 +4,14 @@ Installation | Oracle Database Metrics Exporter - - + + -
      Version: Next

      Installation

      +
      Version: Next

      Installation

      In this section you will find information on running the exporter.

      • In a container runtime like Docker, Podman, etc
      • @@ -43,7 +43,7 @@

        Simple con
      • DB_ROLE (Optional) can be set to SYSDBA, SYSOPER, SYSBACKUP, SYSDG, SYSKM, SYSRAC or SYSASM if you want to connect with one of those roles, however Oracle recommends that you connect with the lowest possible privileges and roles necessary for the exporter to run.

      To run the exporter in a container and expose the port, use a command like this, with the appropriate values for the environment variables:

      -
      docker run -it --rm \
      -e DB_USERNAME=pdbadmin \
      -e DB_PASSWORD=Welcome12345 \
      -e DB_CONNECT_STRING=free23ai:1521/freepdb \
      -p 9161:9161 \
      container-registry.oracle.com/database/observability-exporter:2.1.0
      +
      docker run -it --rm \
      -e DB_USERNAME=pdbadmin \
      -e DB_PASSWORD=Welcome12345 \
      -e DB_CONNECT_STRING=free23ai:1521/freepdb \
      -p 9161:9161 \
      container-registry.oracle.com/database/observability-exporter:2.2.0

      Standalone Binary

      Pre-compiled versions for Linux, ARM and Darwin 64-bit can be found under releases.

      In order to run, you'll need the Oracle Instant Client Basic for your operating system. Only the basic version is required for the exporter.

      diff --git a/docs/docs/next/getting-started/default-metrics/index.html b/docs/docs/next/getting-started/default-metrics/index.html index 1b807d1d..88d40a7c 100644 --- a/docs/docs/next/getting-started/default-metrics/index.html +++ b/docs/docs/next/getting-started/default-metrics/index.html @@ -4,14 +4,14 @@ Default Metrics | Oracle Database Metrics Exporter - - + + -
      Version: Next

      Default Metrics

      +
      Version: Next

      Default Metrics

      The exporter includes default metrics for Oracle Database, and process-specific metrics on the go runtime.

      You can find the exporter's metric schema in the Custom Metrics configuration.

      The following metrics are included by default. The values given are a sample for a single database, "db1":

      diff --git a/docs/docs/next/getting-started/grafana-dashboards/index.html b/docs/docs/next/getting-started/grafana-dashboards/index.html index d7237cdd..a909d773 100644 --- a/docs/docs/next/getting-started/grafana-dashboards/index.html +++ b/docs/docs/next/getting-started/grafana-dashboards/index.html @@ -4,14 +4,14 @@ Grafana Dashboards | Oracle Database Metrics Exporter - - + + -
      Version: Next

      Grafana Dashboards

      +
      Version: Next

      Grafana Dashboards

      Sample Grafana dashboards are included with the exporter.

      A sample Grafana dashboard definition is provided in this directory. You can import these dashboards into your Grafana instance, and set it to use the Prometheus datasource that you have defined for the Prometheus instance that is collecting metrics from the exporter.

      The dashboard shows some basic information, as shown below:

      diff --git a/docs/docs/next/getting-started/kubernetes/index.html b/docs/docs/next/getting-started/kubernetes/index.html index 2ff2f320..1fd0dec6 100644 --- a/docs/docs/next/getting-started/kubernetes/index.html +++ b/docs/docs/next/getting-started/kubernetes/index.html @@ -4,14 +4,14 @@ Kubernetes | Oracle Database Metrics Exporter - - + + -
      Version: Next

      Kubernetes

      +
      Version: Next

      Kubernetes

      You can run the exporter in Kubernetes using provided manifests.

      To run the exporter in Kubernetes, you must complete the following steps. All steps must be completed in the same Kunernetes namespace. The examples below assume you want to use a namespace called exporter, you must change the commands if you wish to use a different namespace.

      Create a secret with credentials for connecting to the Oracle Database

      diff --git a/docs/docs/next/intro/index.html b/docs/docs/next/intro/index.html index 30a036fd..9ffedd65 100644 --- a/docs/docs/next/intro/index.html +++ b/docs/docs/next/intro/index.html @@ -4,14 +4,14 @@ OpenTelemetry Metrics for Oracle Database | Oracle Database Metrics Exporter - - + + -
      Version: Next

      OpenTelemetry Metrics for Oracle Database

      +
      Version: Next

      OpenTelemetry Metrics for Oracle Database

      The Oracle Database Metrics Exporter provides OpenTelemetry-compatible metrics so you can monitor the health, performance, and availability of your databaeses from anywhere.

      The metrics supports monitoring multiple database instances, querying default and custom metrics, and ensures that if one database goes offline for maintenance, the rest stay monitored.

      Over time, this project will provide not just metrics, but also logging and tracing support, and integration into popular frameworks like Spring Boot. The project aims to deliver functionality to support both cloud and on-premises databases, including those running in Kubernetes and containers.

      @@ -23,7 +23,7 @@

      Main Features<
    1. Exports Oracle Database metrics in standard OTEL/Prometheus format
    2. Works with on-prem, in the cloud, and in Kubernetes, with single instance, clustered, or Autonomous Oracle Database instances
    3. Authenticate with plaintext, TLS, and Oracle Wallet
    4. -
    5. Secure credentials with Oracle Cloud Infrastructure (OCI) Vault or Azure Vault
    6. +
    7. Secure credentials with Oracle Cloud Infrastructure (OCI) Vault, Azure Vault, or HashiCorp Vault
    8. Load metrics from one or more databases using a single exporter instance
    9. Export the Prometheus Alert Log in JSON format for easy ingest by log aggregators
    10. Pre-buit AMD64 and ARM64 images provided
    11. diff --git a/docs/docs/next/releases/builds/index.html b/docs/docs/next/releases/builds/index.html index 4a54ffa6..83c202be 100644 --- a/docs/docs/next/releases/builds/index.html +++ b/docs/docs/next/releases/builds/index.html @@ -4,14 +4,14 @@ Builds | Oracle Database Metrics Exporter - - + + -
      Version: Next

      Builds

      The Oracle Database Metrics Exporter publishes cross-platform builds for each release.

      +
      Version: Next

      Builds

      The Oracle Database Metrics Exporter publishes cross-platform builds for each release.

      Binaries:

      • linux/amd64
      • @@ -53,6 +53,6 @@

        3. Build
        cd oracle-db-appdev-monitoring
        make go-build

        You will now have a tar.gz and binary file in the dist/ directory, named according to your target platform.

        For example, for the darwin-arm64 platform:

        -
        dist/
        ├── oracledb_exporter-2.1.0.darwin-arm64
        │ └── oracledb_exporter
        └── oracledb_exporter-2.1.0.darwin-arm64.tar.gz

      +
      dist/
      ├── oracledb_exporter-2.2.0.darwin-arm64
      │ └── oracledb_exporter
      └── oracledb_exporter-2.2.0.darwin-arm64.tar.gz
      \ No newline at end of file diff --git a/docs/docs/next/releases/changelog/index.html b/docs/docs/next/releases/changelog/index.html index 21eef3f4..357b6be3 100644 --- a/docs/docs/next/releases/changelog/index.html +++ b/docs/docs/next/releases/changelog/index.html @@ -4,23 +4,35 @@ Changelog | Oracle Database Metrics Exporter - - + + -
      Version: Next

      Release Notes

      +
      Version: Next

      Release Notes

      List of upcoming and historic changes to the exporter.

      Next, in-development

      +
        +
      • TBD
      • +
      +

      Version 2.2.0, October 28, 2025

      Our current priorities to support metrics for advanced database features and use cases, like Exadata, GoldenGate, and views included in the Oracle Diagnostics Pack.

        +
      • Allow loading database credentials from HashiCorp Vault.
      • +
      • Added experimental support for the go-ora
      • Move oracledb_dbtype metric to the default metrics. You may now disable or override this metric like any other database metric.
      • +
      • Document required database permissions for the exporter.
      • +
      • Fix an issue where some metrics would not be cached when using a per-metric scrape interval with a global scrape interval.
      • +
      • Update third party dependencies
      • +
      • Update Go runtime to 1.24.9

      Thank you to the following people for their suggestions and contributions:

      Version 2.1.0, September 29, 2025

        @@ -290,6 +302,6 @@

        A pre-built container image is provided, based on Oracle Linux, and optimized for size and security.

      Note that this exporter uses a different Oracle Database driver which in turn uses code directly written by Oracle to access the database. This driver does require an Oracle client. In this initial release, the client is bundled into the container image, however we intend to make that optional in order to minimize the image size.

      -

      The interfaces for this version have been kept as close as possible to those of earlier alpha releases in this repository to assist with migration. However, it should be expected that there may be breaking changes in future releases.

      +

      The interfaces for this version have been kept as close as possible to those of earlier alpha releases in this repository to assist with migration. However, it should be expected that there may be breaking changes in future releases.

      \ No newline at end of file diff --git a/docs/docs/next/releases/roadmap/index.html b/docs/docs/next/releases/roadmap/index.html index 3a9edbb4..e695b19f 100644 --- a/docs/docs/next/releases/roadmap/index.html +++ b/docs/docs/next/releases/roadmap/index.html @@ -4,14 +4,14 @@ Roadmap | Oracle Database Metrics Exporter - - + + -
      Version: Next

      Exporter Roadmap

      +
      Version: Next

      Exporter Roadmap

      Planned and upcoming features for the exporter.

      We welcome input on community-driven features you'd like to see supported. Please open an issue in this repository with your suggestions.

      Currently, we plan to address the following key features:

      diff --git a/docs/docs/releases/builds/index.html b/docs/docs/releases/builds/index.html index 49ac7b57..890554f8 100644 --- a/docs/docs/releases/builds/index.html +++ b/docs/docs/releases/builds/index.html @@ -1,17 +1,17 @@ - + -Builds | Oracle Database Metrics Exporter - - +Builds | Oracle Database Metrics Exporter + + -
      Version: 2.1.0

      Builds

      The Oracle Database Metrics Exporter publishes cross-platform builds for each release.

      +
      Version: 2.2.0

      Builds

      The Oracle Database Metrics Exporter publishes cross-platform builds for each release.

      Binaries:

      • linux/amd64
      • @@ -42,6 +42,17 @@

        make go-build-darwin-arm64

      How to build metrics exporter container images

      Creates multi-arch container builds for linux/amd64 and linux/arm64:

      -
      make podman-build
      +
      make podman-build
      +

      Build on Oracle Linux

      +

      To build on Oracle Linux, follow these steps.

      +

      1. Install build tools

      +
      dnf install -y git golang make
      +

      2. Clone the exporter git repository

      +
      git clone git@github.com:oracle/oracle-db-appdev-monitoring.git
      +

      3. Build the binary

      +
      cd oracle-db-appdev-monitoring
      make go-build
      +

      You will now have a tar.gz and binary file in the dist/ directory, named according to your target platform.

      +

      For example, for the darwin-arm64 platform:

      +
      dist/
      ├── oracledb_exporter-2.2.0.darwin-arm64
      │ └── oracledb_exporter
      └── oracledb_exporter-2.2.0.darwin-arm64.tar.gz
      \ No newline at end of file diff --git a/docs/docs/releases/changelog/index.html b/docs/docs/releases/changelog/index.html index fc100da9..3434c204 100644 --- a/docs/docs/releases/changelog/index.html +++ b/docs/docs/releases/changelog/index.html @@ -1,20 +1,35 @@ - + -Changelog | Oracle Database Metrics Exporter - - +Changelog | Oracle Database Metrics Exporter + + -
      Version: 2.1.0

      Release Notes

      +
      Version: 2.2.0

      Release Notes

      List of upcoming and historic changes to the exporter.

      -

      Next, in-development

      +

      Version 2.2.0, October 28, 2025

      Our current priorities to support metrics for advanced database features and use cases, like Exadata, GoldenGate, and views included in the Oracle Diagnostics Pack.

      +
        +
      • Allow loading database credentials from HashiCorp Vault.
      • +
      • Added experimental support for the go-ora
      • +
      • Move oracledb_dbtype metric to the default metrics. You may now disable or override this metric like any other database metric.
      • +
      • Document required database permissions for the exporter.
      • +
      • Fix an issue where some metrics would not be cached when using a per-metric scrape interval with a global scrape interval.
      • +
      • Update third party dependencies
      • +
      • Update Go runtime to 1.24.9
      • +
      +

      Thank you to the following people for their suggestions and contributions:

      +

      Version 2.1.0, September 29, 2025

      • Updated project dependencies.
      • @@ -283,6 +298,6 @@

        A pre-built container image is provided, based on Oracle Linux, and optimized for size and security.

      Note that this exporter uses a different Oracle Database driver which in turn uses code directly written by Oracle to access the database. This driver does require an Oracle client. In this initial release, the client is bundled into the container image, however we intend to make that optional in order to minimize the image size.

      -

      The interfaces for this version have been kept as close as possible to those of earlier alpha releases in this repository to assist with migration. However, it should be expected that there may be breaking changes in future releases.

      +

      The interfaces for this version have been kept as close as possible to those of earlier alpha releases in this repository to assist with migration. However, it should be expected that there may be breaking changes in future releases.

      \ No newline at end of file diff --git a/docs/docs/releases/roadmap/index.html b/docs/docs/releases/roadmap/index.html index 8648357c..f2ad462d 100644 --- a/docs/docs/releases/roadmap/index.html +++ b/docs/docs/releases/roadmap/index.html @@ -1,17 +1,17 @@ - + -Roadmap | Oracle Database Metrics Exporter - - +Roadmap | Oracle Database Metrics Exporter + + -
      Version: 2.1.0

      Exporter Roadmap

      +
      Version: 2.2.0

      Exporter Roadmap

      Planned and upcoming features for the exporter.

      We welcome input on community-driven features you'd like to see supported. Please open an issue in this repository with your suggestions.

      Currently, we plan to address the following key features:

      @@ -24,6 +24,6 @@
    12. Implement support for tracing within the database, e.g., using an execution context ID provide by an external caller
    13. Provide additional pre-built Grafana dashboards,
    14. Integration with Spring Observability, e.g., Micrometer
    15. -
      +
      \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 0ce95018..2deac6b1 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,13 +4,13 @@ Oracle Database Metrics Exporter - - + + -

      Oracle Database Metrics Exporter

      OpenTelemetry Metrics for your Oracle Database instances

      Monitor From Anywhere

      Run the Oracle Database Metrics Exporter as a local binary, container, or in Kubernetes. Use pre-built AMD64 and ARM64 images to easily get started.

      Extensible Database Metrics

      Use the default, include database metrics or define custom metrics with plain SQL queries in simple YAML or TOML files.

      Multiple Databases? No Problem

      Easily monitor one or more databases with a single exporter. One of your databases down or under maintenance? You'll still receive metrics from the others.

      +

      Oracle Database Metrics Exporter

      OpenTelemetry Metrics for your Oracle Database instances

      Monitor From Anywhere

      Run the Oracle Database Metrics Exporter as a local binary, container, or in Kubernetes. Use pre-built AMD64 and ARM64 images to easily get started.

      Extensible Database Metrics

      Use the default, include database metrics or define custom metrics with plain SQL queries in simple YAML or TOML files.

      Multiple Databases? No Problem

      Easily monitor one or more databases with a single exporter. One of your databases down or under maintenance? You'll still receive metrics from the others.

      \ No newline at end of file diff --git a/docs/markdown-page/index.html b/docs/markdown-page/index.html index 4802be3c..2559405b 100644 --- a/docs/markdown-page/index.html +++ b/docs/markdown-page/index.html @@ -4,14 +4,14 @@ Markdown page example | Oracle Database Metrics Exporter - - + + -

      Markdown page example

      +

      Markdown page example

      You don't need React to write simple standalone pages.

      \ No newline at end of file diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 7314ab9f..c3d02a7a 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -1 +1 @@ -https://oracle.github.io/oracle-db-appdev-monitoring/markdown-pageweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/advanced/developmentweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/advanced/go-runtimeweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/advanced/txeventqweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/category/advancedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/category/configurationweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/category/getting-startedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/category/releasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/alert-logsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/azure-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/config-fileweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/custom-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/multiple-databasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/oci-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/oracle-walletweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/getting-started/basicsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/getting-started/default-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/getting-started/grafana-dashboardsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/getting-started/kubernetesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/introweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/releases/changelogweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/releases/roadmapweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/advanced/developmentweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/advanced/go-runtimeweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/advanced/txeventqweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/category/advancedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/category/configurationweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/category/getting-startedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/category/releasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/alert-logsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/azure-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/config-fileweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/custom-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/multiple-databasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/oci-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/oracle-walletweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/getting-started/basicsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/getting-started/default-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/getting-started/grafana-dashboardsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/getting-started/kubernetesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/introweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/releases/changelogweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/releases/roadmapweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/advanced/developmentweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/advanced/go-runtimeweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/advanced/older-versionsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/advanced/txeventqweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/category/advancedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/category/configurationweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/category/getting-startedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/category/releasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/alert-logsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/azure-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/config-fileweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/custom-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/multiple-databasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/oci-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/oracle-walletweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/getting-started/basicsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/getting-started/default-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/getting-started/grafana-dashboardsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/getting-started/kubernetesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/introweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/releases/buildsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/releases/changelogweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/releases/roadmapweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/advanced/developmentweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/advanced/go-runtimeweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/advanced/older-versionsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/advanced/txeventqweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/category/advancedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/category/configurationweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/category/getting-startedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/category/releasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/alert-logsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/azure-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/config-fileweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/custom-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/multiple-databasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/oci-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/oracle-walletweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/getting-started/basicsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/getting-started/default-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/getting-started/grafana-dashboardsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/getting-started/kubernetesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/introweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/releases/buildsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/releases/changelogweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/releases/roadmapweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/weekly0.5 \ No newline at end of file +https://oracle.github.io/oracle-db-appdev-monitoring/markdown-pageweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/advanced/developmentweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/advanced/go-runtimeweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/advanced/txeventqweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/category/advancedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/category/configurationweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/category/getting-startedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/category/releasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/alert-logsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/azure-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/config-fileweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/custom-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/multiple-databasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/oci-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/configuration/oracle-walletweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/getting-started/basicsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/getting-started/default-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/getting-started/grafana-dashboardsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/getting-started/kubernetesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/introweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/releases/changelogweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.3/releases/roadmapweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/advanced/developmentweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/advanced/go-runtimeweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/advanced/txeventqweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/category/advancedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/category/configurationweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/category/getting-startedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/category/releasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/alert-logsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/azure-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/config-fileweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/custom-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/multiple-databasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/oci-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/configuration/oracle-walletweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/getting-started/basicsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/getting-started/default-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/getting-started/grafana-dashboardsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/getting-started/kubernetesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/introweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/releases/changelogweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.0.4/releases/roadmapweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/advanced/developmentweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/advanced/go-runtimeweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/advanced/older-versionsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/advanced/txeventqweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/category/advancedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/category/configurationweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/category/getting-startedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/category/releasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/configuration/alert-logsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/configuration/azure-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/configuration/config-fileweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/configuration/custom-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/configuration/multiple-databasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oci-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/configuration/oracle-walletweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/basicsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/default-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/grafana-dashboardsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/getting-started/kubernetesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/introweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/releases/buildsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/releases/changelogweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/2.1.0/releases/roadmapweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/advanced/developmentweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/advanced/go-oraweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/advanced/go-runtimeweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/advanced/older-versionsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/advanced/txeventqweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/category/advancedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/category/configurationweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/category/getting-startedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/category/releasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/alert-logsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/azure-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/config-fileweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/custom-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/hashicorp-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/multiple-databasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/oci-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/configuration/oracle-walletweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/getting-started/basicsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/getting-started/default-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/getting-started/grafana-dashboardsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/getting-started/kubernetesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/introweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/releases/buildsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/releases/changelogweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/next/releases/roadmapweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/advanced/developmentweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/advanced/go-oraweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/advanced/go-runtimeweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/advanced/older-versionsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/advanced/txeventqweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/category/advancedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/category/configurationweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/category/getting-startedweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/category/releasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/alert-logsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/azure-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/config-fileweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/custom-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/hashicorp-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/multiple-databasesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/oci-vaultweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/configuration/oracle-walletweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/getting-started/basicsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/getting-started/default-metricsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/getting-started/grafana-dashboardsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/getting-started/kubernetesweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/introweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/releases/buildsweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/releases/changelogweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/docs/releases/roadmapweekly0.5https://oracle.github.io/oracle-db-appdev-monitoring/weekly0.5 \ No newline at end of file