# OpenTelemetry Output Plugin

This plugin writes metrics to [OpenTelemetry][opentelemetry] servers and agents
via gRPC or HTTP.

⭐ Telegraf v1.20.0
🏷️ logging, messaging
💻 all

[opentelemetry]: https://opentelemetry.io

## Global configuration options <!-- @/docs/includes/plugin_config.md -->

Plugins support additional global and plugin configuration settings for tasks
such as modifying metrics, tags, and fields, creating aliases, and configuring
plugin ordering. See [CONFIGURATION.md][CONFIGURATION.md] for more details.

[CONFIGURATION.md]: ../../../docs/CONFIGURATION.md#plugins

## Configuration

```toml @sample.conf
# Send OpenTelemetry metrics over gRPC
[[outputs.opentelemetry]]
  ## Override the default (localhost:4317) OpenTelemetry gRPC service
  ## When the protocol is grpc, address:port
  ## When the protocol is http, http(s)://address:port/path
  # service_address = "localhost:4317"
  ## Override the default (protobuf) encodingType when Protocol is http
  ## protobuf, json
  # encoding_type = "protobuf"

  ## Override the default (5s) request timeout
  # timeout = "5s"

  ## Optional TLS Config.
  ##
  ## Root certificates for verifying server certificates encoded in PEM format.
  # tls_ca = "/etc/telegraf/ca.pem"
  ## The public and private key pairs for the client encoded in PEM format.
  ## May contain intermediate certificates.
  # tls_cert = "/etc/telegraf/cert.pem"
  # tls_key = "/etc/telegraf/key.pem"
  ## Use TLS, but skip TLS chain and host verification.
  # insecure_skip_verify = false
  ## Send the specified TLS server name via SNI.
  # tls_server_name = "foo.example.com"

  ## Override the default (gzip) compression used to send data.
  ## Supports: "gzip", "none"
  # compression = "gzip"

  ## Optional proxy settings for HTTP endpoints (service_address starts with http:// or https://)
  # use_system_proxy = false
  # http_proxy_url = ""

  ## Optional proxy settings for gRPC endpoints (service_address is host:port)
  # use_proxy = false
  # proxy_url = ""

  ## NOTE: Due to the way TOML is parsed, tables must be at the END of the
  ## plugin definition, otherwise additional config options are read as part of
  ## the table

  ## Configuration options for the Coralogix dialect
  ## Enable the following section of you use this plugin with a Coralogix endpoint
  # [outputs.opentelemetry.coralogix]
  #   ## Your Coralogix private key (required).
  #   ## Please note that this is sensitive data!
  #   private_key = "your_coralogix_key"
  #
  #   ## Application and subsystem names for the metrics (required)
  #   application = "$NAMESPACE"
  #   subsystem = "$HOSTNAME"

  ## Additional OpenTelemetry resource attributes
  # [outputs.opentelemetry.attributes]
  # "service.name" = "demo"

  ## Optional Bearer token for authentication.
  ## Supports secret-store references, e.g. @{<store-id>:<key>}, so tokens
  ## fetched via the oauth2 secret store are refreshed automatically.
  # token = ""

  ## Additional gRPC request metadata / HTTP headers
  # [outputs.opentelemetry.headers]
  # key1 = "value1"
```

## Supported dialects

### Coralogix

This plugins supports sending data to a [Coralogix](https://coralogix.com)
server by enabling the corresponding dialect by uncommenting
the `[output.opentelemetry.coralogix]` section.

There, you can find the required setting to interact with the server.

- The `private_key` is your Private Key, which you can find in
  `Settings > Send Your Data`.
- The `application`, is your application name, which will be added to your
  `metric attributes`.
- The `subsystem`, is your subsystem, which will be added to your metric
  attributes.

More information in the
[Getting Started page](https://coralogix.com/docs/guide-first-steps-coralogix/).

### Schema

The InfluxDB->OpenTelemetry conversion [schema][] and [implementation][] are
hosted on [GitHub][repo].

For metrics, two input schemata exist.  Line protocol with measurement name
`prometheus` is assumed to have a schema matching [Prometheus input
plugin](../../inputs/prometheus/README.md) when `metric_version = 2`.  Line
protocol with other measurement names is assumed to have schema matching
[Prometheus input plugin](../../inputs/prometheus/README.md) when
`metric_version = 1`.  If both schema assumptions fail, then the line protocol
data is interpreted as:

- Metric type = gauge (or counter, if indicated by the input plugin)
- Metric name = `[measurement]_[field key]`
- Metric value = line protocol field value, cast to float
- Metric labels = line protocol tags

Also see the [OpenTelemetry input plugin](../../inputs/opentelemetry/README.md).

[schema]: https://github.com/influxdata/influxdb-observability/blob/main/docs/index.md
[implementation]: https://github.com/influxdata/influxdb-observability/tree/main/influx2otel
[repo]: https://github.com/influxdata/influxdb-observability
