{"templateId":"markdown","versions":[{"version":"v1.40","label":"v1.40 STS","link":"/products/custody/deployment/reference/telemetry-configuration","default":true,"active":false,"folderId":"c15a2701"},{"version":"v1.39","label":"v1.39 STS","link":"/products/custody/v1.39/deployment/reference/telemetry-configuration","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.38","label":"v1.38 STS","link":"/products/custody/v1.38/deployment/reference/telemetry-configuration","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.34","label":"v1.34 LTS","link":"/products/custody/v1.34/deployment/reference/telemetry-configuration","default":false,"active":true,"folderId":"c15a2701"},{"version":"v1.26","label":"v1.26 LTS","link":"/products/custody/v1.26/deployment/reference/telemetry-configuration","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.19","label":"v1.19 LTS","link":"/products/custody/v1.19/deployment/reference/telemetry-configuration","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.15","label":"v1.15 LTS","link":"/products/custody/v1.15/deployment/reference/telemetry-configuration","default":false,"active":false,"folderId":"c15a2701"}],"sharedDataIds":{"sidebar":"sidebar-products/custody/@v1.15/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"Telemetry configuration","description":"User guides, API reference, and support resources.","siteUrl":"https://docs.ripple.com","lang":"en-US","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"telemetry-configuration","__idx":0},"children":["Telemetry configuration"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Telemetry configuration is an important part of on-premise ","Ripple Custody"," deployments."," ","It defines how the platform collects, processes, and sends telemetry data to the appropriate server."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This page covers Helm chart configuration for telemetry. For an overview of telemetry concepts, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/custody/v1.34/deployment/reference/telemetry"},"children":["Configure telemetry"]},". For OTEL Collector deployment, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/custody/v1.34/deployment/reference/telemetry-collector"},"children":["OTEL Collector deployment"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"helm-chart-valuesyaml","__idx":1},"children":["Helm chart values.yaml"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Most of the fields in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["values.yaml"]}," file of ","Ripple Custody"," Helm charts are Go templates that import and concatenate several neighboring fields."," ","You can use them to configure telemetry in ","Ripple Custody"," in a granular way. For example, send the logs and traces to Elasticsearch and the metrics to Prometheus."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["telemetry"]}," section has three main sub-sections:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["General telemetry configuration"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Syslog configuration"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["OTEL configuration"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The telemetry configuration fields for ","Ripple Custody"," are as follows:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"harmonize:\n  telemetry:\n\n    # Possible values: `otlp` | `disabled`\n    type: 'otlp'\n\n      # Possible values: `http` | `https`\n    protocol: 'https'\n\n    host: 'my-telemetry-hostname.com'\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following describes each of the three ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["telemetry"]}," sub-sections."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"general-telemetry","__idx":2},"children":["General telemetry"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can configure the ","Ripple Custody"," Helm charts to use an external telemetry endpoint, that is OTEL Collector or an OTEL-compatible telemetry backend."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["values.yaml"]}," file, the general telemetry configuration is in the following format:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"Ripple Custody:\n  telemetry:\n    type: 'otlp'\n    protocol: 'https'\n    host: 'my-telemetry-hostname.com'\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Telemetry Field"},"children":["Telemetry Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"type"},"children":["type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"default value"},"children":["default value"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"possible values"},"children":["possible values"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["disabled"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["disabled"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["otlp"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["jeager"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["azure"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Type of telemetry used"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["protocol"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Protocol used by ","Ripple Custody"," components to send telemetry data"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["host"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["None"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Any host"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Hostname the telemetry data is sent to"]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The hostname must not include a port. This information is set up automatically for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["otel-grpc"]}," (4317), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["otel-http"]}," (4318), and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["syslog"]}," (54526)."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["By default, the Helm charts check whether a local OTEL Collector exists and use it for the telemetry configuration."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Disclaimer"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This setup is intended for testing purposes only. Do not use it in production."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the following field in is set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"opentelemetry-collector:\n  enabled: true\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Helm charts import the telemetry configuration from OTEL Collector and inject it into the ","Ripple Custody"," telemetry configuration."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"otel","__idx":3},"children":["OTEL"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"harmonize:\n  telemetry:\n    otel:\n      enabled: true\n      host: 'my-otel-host.com'\n\n      # Possible values: `http` | `https`\n      protocol: 'https'\n\n      sdk-environment-variables:\n        OTEL_TRACES_EXPORTER: 'otlp'\n        OTEL_METRICS_EXPORTER: 'otlp'\n        OTEL_LOGS_EXPORTER: 'otlp'\n        OTEL_LOG_LEVEL: 'info'\n        OTEL_METRIC_EXPORT_INTERVAL: '15000'\n        OTEL_METRIC_EXPORT_TIMEOUT: '10000'\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field name"},"children":["Field name"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Format"},"children":["Format"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Default Value"},"children":["Default Value"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["enabled"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string/boolean"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Go template"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Determines whether the  OTEL Collector is enabled or not."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["host"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Hostname"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Go template"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Specifies the host for the OTEL endpoint. By default, the value is determined by the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["host"]}," field in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["telemetry"]}," configuration."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["protocol"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Network Protocol (level 7)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Go template"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Specifies the protocol used by the OTEL endpoint. By default, The value is determined by the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["protocol"]}," field in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["telemetry"]}," configuration."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["httpPort"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Port"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Go template"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Specifies the HTTP port for the OTEL endpoint."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grpcPort"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Port"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Go template"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Specifies the gRPC port for the OTEL endpoint."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["httpEndpoint"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["URI"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Go template"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Specifies the HTTP endpoint for the OTEL endpoint. The endpoint is constructed using the neighboring ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["protocol"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["host"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["port"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grpcEndpoint"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["URI"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Go template"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Specifies the gRPC endpoint for the OTEL endpoint. The endpoint is constructed using the neighboring ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["protocol"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["host"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["port"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sdk-environment-variables"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["field of key/value pairs"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/","target":"_blank"},"children":["OTEL SDK environment variables"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["logs"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Field of key-value pairs"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#configuration-of-multiple-backends"},"children":["Configuration of multiple backends"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["traces"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Field of key-value pairs"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#configuration-of-multiple-backends"},"children":["Configuration of multiple backends"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["metrics"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["object"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Field of key-value pairs"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#configuration-of-multiple-backends"},"children":["Configuration of multiple backends"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The configuration provides parameters (port/endpoint) for both ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["gRPC"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["HTTP"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is because different ","Ripple Custody"," components send telemetry data using either one or the other protocol."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":5,"id":"multiple-backends","__idx":4},"children":["Multiple backends"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ","Ripple Custody"," Helm charts give you the option to specify data export to three different telemetry backends:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"harmonize:\n  telemetry:\n  enabled: true\n    otel:\n      logs: \n        host: 'my-otel-endpoint-for-logs.com'\n      traces: \n        host: 'my-otel-endpoint-for-traces.com'\n      metrics: \n        host: 'my-otel-endpoint-for-metrics.com'\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/otel-sdk-multiple-otel-endpoints.43d68abbfebe6049a80a17df2b815b655f37ba73fe4fcd87eb8b88bf29bcfe78.322370a9.svg","alt":"Diagram showing OTEL SDK configured with separate endpoints for logs, traces, and metrics telemetry data"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The sub-fields ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["logs"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["traces"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["metrics"]}," follow the same pattern, without the field ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sdk-environment-variables"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"harmonize:\n  telemetry:\n    otel:\n      # Logs config\n      logs:\n        # Enable or disable\n        enabled: true\n        host: 'my-otel-endpoint-for-logs.com'\n        protocol: 'https'\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following configuration shows two different telemetry backends:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["One telemetry backend for logs and traces."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["One telemetry backend for metrics."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"harmonize:\n    telemetry:\n      type: otlp\n      protocol: http\n      host: 'my-otel-endpoint-for-logs-and-traces.com'  # E.g. Elasticsearch\n\n      otel:\n        metrics:\n          host: 'my-otel-endpoint-for-metrics.com'      # E.g Prometheus\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/otel-sdk-elastic-search-prometheus.6eef3c9d761ac0e7fa48427064db1f4cc8d0c6764831bffdd4638ed1cbb53345.322370a9.svg","alt":"Diagram showing OTEL SDK sending logs and traces to Elasticsearch and metrics to Prometheus"},"children":[]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"syslog","__idx":5},"children":["Syslog"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Syslog configuration is in the following format:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"syslog:\n  enabled: true\n  host: 'my-syslog-receiver-hostname.com'\n  port: '54526'\n  gatewayName: harmonize_syslog\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field name"},"children":["Field name"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Format"},"children":["Format"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Default Value"},"children":["Default Value"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["enabled"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["boolean"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Whether the syslog is enabled or not."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["protocol"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Network Protocol (level 4)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tcp"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The protocol used by Syslog."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["host"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Hostname"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Determined by the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["host"]}," field in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["otel"]}," configuration"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The host for the syslog."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["port"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["int"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["54526"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The port for the Syslog."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["gatewayName"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["string"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["harmonize_syslog"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The name of the syslog gateway."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["By default, the Go template imports values for some of the fields from the OTEL Collector sub-chart configuration. For more information, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#telemetry-data-reception"},"children":["Telemetry data reception"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"otel-sdk-environment-variables","__idx":6},"children":["OTEL SDK environment variables"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can specify OTEL SDK environment variables in ","Ripple Custody"," Helm charts."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information about how to configure telemetry instrumentation and export, see the Open Telemetry ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/","target":"_blank"},"children":["OTEL SDK environment variable specification"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["By default, the ","Ripple Custody"," Helm charts configure some environment variables with default values:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"harmonize:\n  telemetry:\n    otel:\n      sdk-environment-variables:\n        OTEL_TRACES_EXPORTER: 'otlp'\n        OTEL_METRICS_EXPORTER: 'otlp'\n        OTEL_LOGS_EXPORTER: 'otlp'\n        OTEL_LOG_LEVEL: 'info'\n        OTEL_METRIC_EXPORT_INTERVAL: '15000'\n        OTEL_METRIC_EXPORT_TIMEOUT: '10000'\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The system injects every environment variable specified in this field into every pod that uses the OTEL SDK."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["An important configuration change is required for customers upgrading to Custody Application version LTS 1.34.x."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["As part of our ongoing commitment to security and performance, version 1.34.x includes a major upgrade to the underlying OpenTelemetry (OTel) Java Agent to address recent upstream security vulnerabilities (CVEs). While this upgrade ensures your deployment remains secure, it introduces a behavioral change in how telemetry data is exported."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This change only affects your environment if both of the following apply:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["You are deploying or upgrading to Custody Application v1.34.x."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["You have explicitly enabled OpenTelemetry monitoring in your deployment."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the newer version of the OpenTelemetry agent, the default export protocol has been changed by the upstream maintainers from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grpc"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http/protobuf"]},". However, standard OTel gRPC collectors typically listen on port ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["4317"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you upgrade to v1.34.x without adjusting your configuration, the agent will attempt to send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http/protobuf"]}," traffic to the gRPC port, resulting in your telemetry collector rejecting the data. You may see the following errors in your service logs, and your observability dashboards will stop receiving new data:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"text","header":{"controls":{"copy":{}}},"source":"WARN - OTLP exporter endpoint port is likely incorrect for protocol version \"http/protobuf\". Port 4317 typically uses grpc.\nERROR - Failed to export spans. Connection reset by peer\n","lang":"text"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This issue only impacts observability and telemetry collection. Core application functionality, performance, and data integrity remain completely unaffected."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To maintain your current telemetry flow and preserve the gRPC export behavior on port ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["4317"]},", you must explicitly define the protocol in your environment before starting the upgraded services."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Apply one of the following configuration changes depending on your deployment method."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Option 1: Environment variable (recommended for Docker/Helm)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Add the following environment variable to your container or OS startup environment:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"OTEL_EXPORTER_OTLP_PROTOCOL=\"grpc\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Option 2: Java Virtual Machine (JVM) options"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you manage JVM arguments directly, append the following system property:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"JAVA_TOOL_OPTIONS=\"-Dotel.exporter.otlp.protocol=grpc\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you have any questions or require assistance implementing this configuration change, contact your assigned CPE or the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://metaco.atlassian.net/servicedesk/customer/portal/1"},"children":["Technical Services team"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"managed-environment-variables","__idx":7},"children":["Managed environment variables"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Some OTEL SDK environment variables are already defined at either the application level or by the Helm charts."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The application handles these OTEL SDK environment variables:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_SERVICE_NAME"]}," (with a unique value for each ","Ripple Custody"," component and indexer)"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Helm charts Go Templates dynamically define those values based on the YAML values found in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["values.yaml"]}," file at location ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["harmonize.telemetry.otel"]},":"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_SDK_DISABLED"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_EXPORTER_OTLP_ENDPOINT"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_EXPORTER_OTLP_LOGS_ENDPOINT"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_EXPORTER_OTLP_METRICS_ENDPOINT"]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The charts override all of the environment variables listed above."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":4,"id":"logs-best-practices","__idx":8},"children":["Logs best practices"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You must configure the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/#batch-logrecord-processor","target":"_blank"},"children":["Batch LogRecord Processor (BLRP)"]}," optimally to prevent loss of logs during intermittent outages of the OTEL endpoint (either OTEL Collector or another telemetry backend)."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The logs best practices also apply to traces with the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/#batch-span-processor","target":"_blank"},"children":["OTEL SDK Batch Span Processor"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information on how the BLRP works, see the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://opentelemetry.io/docs/specs/otel/logs/sdk/","target":"_blank"},"children":["OTEL SDK log specification"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The goal is to strike a balance between memory consumption, export frequency, and network overhead."," ","Regularly monitor the system to fine-tune the BLRP settings and ensure log export runs smoothly."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following table lists the environment variables available to configure the BLRP:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Environment variable Name"},"children":["Environment variable Name"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Type"},"children":["Type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Format"},"children":["Format"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Default Value"},"children":["Default Value"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_BLRP_SCHEDULE_DELAY"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["integer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["milliseconds"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["1000 (OTEL SDK default value)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["OTEL SDK interval between logs export attempts. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#otel_blrp_schedule_delay"},"children":["OTEL_BLRP_SCHEDULE_DELAY"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_BLRP_EXPORT_TIMEOUT"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["integer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["milliseconds"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["30000 (OTEL SDK default value)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["OTEL SDK time window for successful log exports. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#otel_blrp_export_timeout"},"children":["OTEL_BLRP_EXPORT_TIMEOUT"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_BLRP_MAX_QUEUE_SIZE"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["integer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["milliseconds"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["2048 (OTEL SDK default value)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["OTEL SDK in-memory queue maximum buffer size retaining logs in case of OTEL endpoint unavailability. See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#otel_blrp_max_queue_size"},"children":["OTEL_BLRP_MAX_QUEUE_SIZE"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_BLRP_MAX_EXPORT_BATCH_SIZE"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["integer"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["milliseconds"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["512 (OTEL SDK default value)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["OTEL SDK maximum logs export batch size. Must be less than or equal to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_BLRP_MAX_QUEUE_SIZE"]},". See ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#otel_blrp_max_export_batch_size"},"children":["OTEL_BLRP_MAX_EXPORT_BATCH_SIZE"]},"."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":5,"id":"otel_blrp_schedule_delay","__idx":9},"children":["OTEL_BLRP_SCHEDULE_DELAY"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This variable specifies the interval between export attempts."," ","If you reduce the default value, OTEL attempts to export logs more frequently, which can be beneficial for pushing logs when the endpoint is still alive or as soon as the endpoint is back online."," ","A much shorter delay could lead to increased operational overhead if the endpoint remains unavailable for an extended period."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":6,"id":"throttling-and-rate-limiting","__idx":10},"children":["Throttling and rate limiting"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["More frequent export attempts mean more network packets sent out."," ","This increases the load on the network, potentially causing congestion, especially if multiple instances or services are trying to export logs simultaneously."," ","If the endpoint or any intermediate system, such as a firewall, gateway, router, or ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://kubernetes.io/docs/concepts/services-networking/network-policies/","target":"_blank"},"children":["Kubernetes network policy"]},", has rate-limiting mechanisms in place, very frequent export attempts might hit these limits, causing valid and important requests to be dropped or delayed."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can apply ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/#support-traffic-shaping","target":"_blank"},"children":["Kubernetes traffic shaping"]}," using the following pod annotations:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["kubernetes.io/ingress-bandwidth"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["kubernetes.io/egress-bandwidth"]}]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"apiVersion: v1\nkind: Pod\nmetadata:\n  annotations:\n    kubernetes.io/ingress-bandwidth: 1M\n    kubernetes.io/egress-bandwidth: 1M\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information, see ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://stackoverflow.com/questions/54253622/kubernetes-how-to-implement-a-network-resourcequota","target":"_blank"},"children":["network resource quota"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":6,"id":"cpu-overhead","__idx":11},"children":["CPU overhead"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each export attempt requires CPU cycles to prepare and send the data."," ","More frequent attempts can result in higher CPU usage."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the Helm chart configuration, you must set appropriate Kubernetes CPU resource settings for each component:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["resources.requests.cpu"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["resources.limits.cpu"]}]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"components:\n  target-harmonize-component:\n    resources:\n      requests:\n        cpu: 1              # MUST be custom based on needs.\n      limits:\n        cpu: 1              # MUST be custom based on needs.\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":5,"id":"otel_blrp_export_timeout","__idx":12},"children":["OTEL_BLRP_EXPORT_TIMEOUT"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This variable grants a more extended window for successful log exports, particularly pertinent during transient networking or OTEL endpoint glitches."," ","Increasing this value directly affects the time the OTEL SDK is willing to wait for an acknowledgment or response from the OTEL endpoint after attempting to export logs."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You also ideally need to increase this value in tandem with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_BLRP_MAX_QUEUE_SIZE"]}," and pod memory allocation, to avoid potential backlog problems in the OTEL SDK queue."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If each export attempt waits for an extended timeout period, it can cause subsequent export attempts to queue up or delay, especially if the system is generating logs at a high rate."," ","This can create a backlog of logs waiting to be exported."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":5,"id":"otel_blrp_max_queue_size","__idx":13},"children":["OTEL_BLRP_MAX_QUEUE_SIZE"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When the endpoint is unavailable, logs start to accumulate in the BLRP's queue. The OTEL SDK stores this queue in memory."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Increasing this value offers a larger buffer to retain logs during short-lived OTEL and OTEL-compatible endpoint disruptions."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In tandem with this change, you must also adjust the pod's memory resources."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the configuration, appropriate Kubernetes ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Memory"]}," resource settings must be set for each component:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["resources.requests.memory"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["resources.limits.memory"]}]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"yaml","header":{"controls":{"copy":{}}},"source":"components:\n  target-harmonize-component:\n    resources:\n      requests:\n        memory: \"4Gi\"       # MUST be custom based on needs.\n      limits:\n        memory: \"4Gi\"       # MUST be custom based on needs.\n","lang":"yaml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When you double the value of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_BLRP_MAX_QUEUE_SIZE"]},", also increase pod memory limits proportionally."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This ensures the pod has adequate memory to manage the enlarged log queue without risking an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OutOfMemory"]}," error."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":5,"id":"otel_blrp_max_export_batch_size","__idx":14},"children":["OTEL_BLRP_MAX_EXPORT_BATCH_SIZE"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This variable determines the maximum number of log records the system bundles together and exports in a single batch to the endpoint. Configuring this parameter effectively is crucial for both performance and reliability."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_BLRP_MAX_EXPORT_BATCH_SIZE"]}," value must always be equal to or lower than ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_BLRP_MAX_QUEUE_SIZE"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you've increased the queue size, consider adjusting this variable accordingly. A balanced batch size ensures that the restored endpoint isn't inundated with an overly large volume of logs all at once."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The size of the batch should be in line with the capacity of the endpoint to process incoming logs. If the batch size exceeds the endpoint's processing capability, it may reject or drop the batch. For example, if you know that your endpoint can reliably handle 1000 log records per second, setting the batch size to a value far greater might overload the endpoint."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A larger batch size means more data sent at once, which can result in network congestion or increased latency, especially in bandwidth-limited environments. Make sure the network configuration is adequate to handle large batch exports."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When the OTEL endpoint is unavailable, logs start to accumulate in the BLRP's queue. Once the endpoint is available again, the OTEL SDK exports log batches larger than usual to clear the queue. A larger export batch size can help clear the queued logs faster, ensuring quicker recovery. However, balance this against the potential risk of overwhelming the endpoint."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["We recommend you start with a value that's aligned with the endpoint's known processing capacity and the available network bandwidth. Monitor the system's behavior, especially during and after endpoint outages. Adjust ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OTEL_BLRP_MAX_EXPORT_BATCH_SIZE"]}," based on real-world observations, ensuring that you achieve a balance between speedy recovery after outages and not overwhelming the endpoint or network."]}]},"headings":[{"value":"Telemetry configuration","id":"telemetry-configuration","depth":1},{"value":"Helm chart values.yaml","id":"helm-chart-valuesyaml","depth":3},{"value":"General telemetry","id":"general-telemetry","depth":4},{"value":"OTEL","id":"otel","depth":4},{"value":"Multiple backends","id":"multiple-backends","depth":5},{"value":"Syslog","id":"syslog","depth":4},{"value":"OTEL SDK environment variables","id":"otel-sdk-environment-variables","depth":3},{"value":"Managed environment variables","id":"managed-environment-variables","depth":4},{"value":"Logs best practices","id":"logs-best-practices","depth":4},{"value":"OTEL_BLRP_SCHEDULE_DELAY","id":"otel_blrp_schedule_delay","depth":5},{"value":"Throttling and rate limiting","id":"throttling-and-rate-limiting","depth":6},{"value":"CPU overhead","id":"cpu-overhead","depth":6},{"value":"OTEL_BLRP_EXPORT_TIMEOUT","id":"otel_blrp_export_timeout","depth":5},{"value":"OTEL_BLRP_MAX_QUEUE_SIZE","id":"otel_blrp_max_queue_size","depth":5},{"value":"OTEL_BLRP_MAX_EXPORT_BATCH_SIZE","id":"otel_blrp_max_export_batch_size","depth":5}],"frontmatter":{"seo":{"title":"Telemetry configuration"}},"lastModified":"2026-06-30T18:46:52.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/products/custody/v1.34/deployment/reference/telemetry-configuration","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}