View Source opentelemetry_exporter
The OpenTelemetry Protocol exporter for use with the OpenTelemetry Collector. The version of this Application does not track the supported version of the OpenTelemetry Protocol (OTLP). The currently used version of the OTLP protobufs is v0.11.0.
Currently only supports the Tracer protocol using either GRPC or Protobuffers over HTTP1.1.
Configuration
By default the exporter will use HTTP to export protobuf encoded Spans to
http://localhost:4318/v1/traces
.
Available configuration keys:
otlp_endpoint
: The URL to send traces and metrics to, for traces the pathv1/traces
is appended to the path in the URL.otlp_traces_endpoint
: URL to send only traces to. This takes precedence for exporting traces and the path of the URL is kept as is, no suffix is appended.otlp_headers
: List of additional headers ([{unicode:chardata(), unicode:chardata()}]
) to add to export requests.otlp_traces_headers
: Additional headers ([{unicode:chardata(), unicode:chardata()}]
) to add to only trace export requests.otlp_protocol
: The transport protocol, supported values:grpc
andhttp_protobuf
. Defaults tohttp_protobuf
.otlp_traces_protocol
: The transport protocol to use for exporting traces, supported values:grpc
andhttp_protobuf
. Defaults tohttp_protobuf
.otlp_compression
: Compression type to use, supported values:gzip
. Defaults to no compression.otlp_traces_compression
: Compression type to use for exporting traces, supported values:gzip
. Defaults to no compression.ssl_options
: See below.
{opentelemetry_exporter,
[{otlp_protocol, grpc},
{otlp_compression, gzip},
{otlp_endpoint, "https://api.honeycomb.io:443"},
{otlp_headers, [{"x-honeycomb-dataset", "experiments"}]}]}
An Elixir release uses runtime.exs
:
config :opentelemetry_exporter,
otlp_protocol: :grpc,
otlp_compression: :gzip,
otlp_endpoint: "https://api.honeycomb.io:443",
otlp_headers: [{"x-honeycomb-dataset", "experiments"}]
Furthermore, you need to configure Elixir apps to load opentelemetry_exporter
before opentelemetry
itself, for more information see https://github.com/open-telemetry/opentelemetry-erlang#design.
SSL options
The default SSL options for HTTPS requests are set using tls_certificate_check. This package also provides the CA certificates from Mozilla.
The user can override these options either as part of the endpoint or for all
endpoints used by the exporter with the Application environment variable
ssl_options
:
{opentelemetry_exporter,
[{otlp_endpoint, "https://example.com:4318"},
{ssl_options, [{cert, "..."}, {key, "..."}]}]}
config :opentelemetry_exporter,
otlp_endpoint: "https://example.com:4318",
ssl_options: [cert: "...", key: "..."]
See secure coding with inets for more information on securing HTTP requests in Erlang.
OS Environment
Lastly, configuring the exporter can be done with OS environment variables, which take precedence:
OTEL_EXPORTER_OTLP_ENDPOINT
: The URL to send traces and metrics to, for traces the pathv1/traces
is appended to the path in the URL.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
: URL to send only traces to. This takes precedence for exporting traces and the path of the URL is kept as is, no suffix is appended.OTEL_EXPORTER_OTLP_HEADERS
: List of additional headers to add to export requests.OTEL_EXPORTER_OTLP_TRACES_HEADERS
: Additional headers to add to only trace export requests.OTEL_EXPORTER_OTLP_PROTOCOL
: The transport protocol to use, supported values:grpc
andhttp_protobuf
. Defaults tohttp_protobuf
OTEL_EXPORTER_OTLP_TRACES_PROTOCOL
: The transport protocol to use for exporting traces, supported values:grpc
andhttp_protobuf
. Defaults tohttp_protobuf
.OTEL_EXPORTER_OTLP_COMPRESSION
: Compression to use, supported value: gzip. Defaults to no compression.OTEL_EXPORTER_OTLP_TRACES_COMPRESSION
: Compression to use when exporting traces, supported value: gzip. Defaults to no compression.
Example usage of setting the environment variables:
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://api.honeycomb.io:443
OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=grpc
OTEL_EXPORTER_OTLP_TRACES_COMPRESSION=gzip
OTEL_EXPORTER_OTLP_TRACES_HEADERS=x-honeycomb-team=<HONEYCOMB API TOKEN>,x-honeycomb-dataset=experiments
Options to span processor
In addition to using the environment variables the exporter accepts a map of
arguments. The argument to the exporter's init
function can be configured as
part of the Span Processor (simple or batch) in the OpenTelemetry application
environment.
For an Erlang release in sys.config
:
{opentelemetry,
[{processors,
[{otel_batch_processor,
#{exporter => {opentelemetry_exporter, #{endpoints =>
["http://localhost:9090"],
headers => [{"x-honeycomb-dataset", "experiments"}]}}}}]}]}
The default protocol is http_protobuf
, to override this and use grpc add
protocol
to the config map:
{opentelemetry,
[{processors,
[{otel_simple_processor,
#{exporter => {opentelemetry_exporter, #{protocol => grpc,
endpoints => ["http://localhost:9090"],
headers => [{"x-honeycomb-dataset", "experiments"}]}}}}]}]}
In Elixir, you can use config.exs
or runtime.exs
:
config :opentelemetry, :processors,
otel_batch_processor: %{
exporter: {:opentelemetry_exporter, %{endpoints: ["http://localhost:9090"],
headers: [{"x-honeycomb-dataset", "experiments"}]}}
}
To explicitly disable exporting spans, the traces_exporter
can be set to none
in the
opentelemetry
config:
{opentelemetry, [{traces_exporter, none}]}
config :opentelemetry, traces_exporter: :none
The configuration map
The second element of the configuration tuple is a configuration map. It can contain the following keys:
protocol
- one of:http_protobuf
,grpc
orhttp_json
. Defaults tohttp_protobuf
.http_json
is not implemented yet.endpoints
- A list of endpoints to send traces to. Can take one of the forms described below. By default, exporter sends data tohttp://localhost:4318
.headers
- a list of headers to send to the collector (i.e[{<<"x-access-key">> <<"secret">>}]
). Defaults to an empty list.compression
- an atom. Setting it togzip
enables gzip compression.ssl_options
- a list of SSL options. See Erlang's SSL docs for what options are available.
Upgrading OpenTelemetry Protos
The protos are in a separate repository, opentelemetry-proto, and used as a submodule in this repo. To update the Erlang protobuf modules and GRPC client first update the submodule and then use the rebar3 grpcbox plugin to generate the client:
$ pushd apps/opentelemetry_exporter/opentelemetry-proto
$ git fetch origin
$ git checkout <tag>
$ popd
# bug in grpcbox plugin means we need to delete _pb files first to regenerate them
$ rm ./apps/opentelemetry_exporter/src/opentelemetry_exporter_trace_service_pb.erl ./apps/opentelemetry_exporter/src/opentelemetry_exporter_metrics_service_pb.erl ./apps/opentelemetry_exporter/src/opentelemetry_exporter_logs_service_pb.erl
$ rebar3 grpc gen -t client
...
$ mv apps/opentelemetry_exporter/src/opentelemetry_proto_collector_trace_v_1_trace_service_client.erl apps/opentelemetry_exporter/src/opentelemetry_trace_service.erl
$ mv apps/opentelemetry_exporter/src/opentelemetry_proto_collector_logs_v_1_logs_service_client.erl apps/opentelemetry_exporter/src/opentelemetry_logs_service.erl
$ mv apps/opentelemetry_exporter/src/opentelemetry_proto_collector_metrics_v_1_metrics_service_client.erl apps/opentelemetry_exporter/src/opentelemetry_metrics_service.erl
Then open each moved module and fix the module name.