title: opentelemetry

Description

OpenTelemetry report Tracing data according to opentelemetry specification.

Just support reporting in HTTP with Content-Type=application/x-protobuf, the specification: OTLP/HTTP Request

Attributes

NameTypeRequirementDefaultValidDescription
samplerobjectoptionalsampling config
sampler.namestringoptionalalways_off[“always_on”, “always_off”, “trace_id_ratio”, “parent_base”]sampling strategy,always_on:sampling all;always_off:sampling nothing;trace_id_ratio:base trace id percentage;parent_base:use parent decision, otherwise determined by root
sampler.optionsobjectoptional{fraction = 0, root = {name = “always_off”}}sampling strategy parameters
sampler.options.fractionnumberoptional0[0, 1]trace_id_ratio fraction
sampler.options.rootobjectoptional{name = “always_off”, options = {fraction = 0}}parent_base root sampler
sampler.options.root.namestringoptionalalways_off[“always_on”, “always_off”, “trace_id_ratio”]sampling strategy
sampler.options.root.optionsobjectoptional{fraction = 0}sampling strategy parameters
sampler.options.root.options.fractionnumberoptional0[0, 1]trace_id_ratio fraction
additional_attributesarray[string]optionalattributes (variable and its value) which will be appended to the trace span
additional_attributes[0]stringrequiredAPISIX or Nginx variable, like http_header or route_id

How To Enable

First of all, enable the opentelemetry plugin in the config.yaml:

# Add this in config.yaml
plugins:
  - ... # plugin you need
  - opentelemetry

Then reload APISIX.

Here's an example, enable the opentelemetry plugin on the specified route:

curl http://127.0.0.1:9080/apisix/admin/routes/1  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "methods": ["GET"],
    "uris": [
        "/uid/*"
    ],
    "plugins": {
        "opentelemetry": {
            "sampler": {
                "name": "always_on"
            }
        }
    },
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "10.110.149.175:8089": 1
        }
    }
}'

How to set collecting

You can set the collecting by specifying the configuration in conf/config.yaml.

NameTypeDefaultDescription
trace_id_sourceenumrandomthe source of trace id, the valid value is random or x-request-id. If x-request-id is set, the value of x-request-id request header will be used as trace id. Please make sure it match regex pattern [0-9a-f]{32}
resourceobjectadditional resource append to trace
collectorobject{address = “127.0.0.1:4317”, request_timeout = 3}otlp collector
collector.addressstring127.0.0.1:4317collector address
collector.request_timeoutinteger3report request timeout(second)
collector.request_headersobjectreport request http headers
batch_span_processorobjecttrace span processor
batch_span_processor.drop_on_queue_fullbooleantruedrop span when queue is full, otherwise force process batches
batch_span_processor.max_queue_sizeinteger2048maximum queue size to buffer spans for delayed processing
batch_span_processor.batch_timeoutnumber5maximum duration(second) for constructing a batch
batch_span_processor.max_export_batch_sizeinteger256maximum number of spans to process in a single batch
batch_span_processor.inactive_timeoutnumber2timer interval(second) for processing batches

Here is an example:

plugin_attr:
  opentelemetry:
    resource:
      service.name: APISIX
      tenant.id: business_id
    collector:
      address: 192.168.8.211:4317
      request_timeout: 3
      request_headers:
        foo: bar
    batch_span_processor:
      drop_on_queue_full: false
      max_queue_size: 6
      batch_timeout: 2
      inactive_timeout: 1
      max_export_batch_size: 2

Disable Plugin

When you want to disable the opentelemetry plugin on a route/service, it is very simple, you can delete the corresponding JSON configuration in the plugin configuration, no need to restart the service, it will take effect immediately:

$ curl http://127.0.0.1:9080/apisix/admin/routes/1  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "methods": ["GET"],
    "uris": [
        "/uid/*"
    ],
    "plugins": {
    },
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "10.110.149.175:8089": 1
        }
    }
}'