Files
2026-07-13 12:32:21 +08:00

118 lines
5.0 KiB
Lua

local typedefs = require "kong.db.schema.typedefs"
local Schema = require "kong.db.schema"
local function custom_validator(attributes)
for _, v in pairs(attributes) do
local vtype = type(v)
if vtype ~= "string" and
vtype ~= "number" and
vtype ~= "boolean"
then
return nil, "invalid type of value: " .. vtype
end
if vtype == "string" and #v == 0 then
return nil, "required field missing"
end
end
return true
end
local resource_attributes = Schema.define {
type = "map",
description = "Attributes to add to the OpenTelemetry resource object, following the spec for Semantic Attributes. \nThe following attributes are automatically added:\n- `service.name`: The name of the service (default: `kong`).\n- `service.version`: The version of Kong Gateway.\n- `service.instance.id`: The node ID of Kong Gateway.\n\nYou can use this property to override default attribute values. For example, to override the default for `service.name`, you can specify `{ \"service.name\": \"my-service\" }`.",
keys = { type = "string", required = true },
-- TODO: support [string, number, boolean]
values = { type = "string", required = true },
custom_validator = custom_validator,
}
return {
name = "opentelemetry",
fields = {
{ protocols = typedefs.protocols_http }, -- TODO: support stream mode
{ config = {
type = "record",
fields = {
{ traces_endpoint = typedefs.url { referenceable = true } }, -- OTLP/HTTP
{ logs_endpoint = typedefs.url { referenceable = true } },
{ headers = { description = "The custom headers to be added in the HTTP request sent to the OTLP server. This setting is useful for adding the authentication headers (token) for the APM backend.", type = "map",
keys = typedefs.header_name,
values = {
type = "string",
referenceable = true,
},
} },
{ resource_attributes = resource_attributes },
{ queue = typedefs.queue {
default = {
max_batch_size = 200,
},
} },
{ batch_span_count = {
description = "The number of spans to be sent in a single batch.",
type = "integer",
deprecation = {
message = "opentelemetry: config.batch_span_count is deprecated, please use config.queue.max_batch_size instead",
removal_in_version = "4.0",
old_default = 200 }, }, },
{ batch_flush_delay = {
description = "The delay, in seconds, between two consecutive batches.",
type = "integer",
deprecation = {
message = "opentelemetry: config.batch_flush_delay is deprecated, please use config.queue.max_coalescing_delay instead",
removal_in_version = "4.0",
old_default = 3, }, }, },
{ connect_timeout = typedefs.timeout { default = 1000 } },
{ send_timeout = typedefs.timeout { default = 5000 } },
{ read_timeout = typedefs.timeout { default = 5000 } },
{ http_response_header_for_traceid = { description = "Specifies a custom header for the `trace_id`. If set, the plugin sets the corresponding header in the response.",
type = "string",
default = nil }},
{ header_type = { description = "All HTTP requests going through the plugin are tagged with a tracing HTTP request. This property codifies what kind of tracing header the plugin expects on incoming requests.",
type = "string",
deprecation = {
message = "opentelemetry: config.header_type is deprecated, please use config.propagation options instead",
removal_in_version = "4.0",
old_default = "preserve" },
required = false,
default = "preserve",
one_of = { "preserve", "ignore", "b3", "b3-single", "w3c", "jaeger", "ot", "aws", "gcp", "datadog", "instana" } } },
{ sampling_rate = {
description = "Tracing sampling rate for configuring the probability-based sampler. When set, this value supersedes the global `tracing_sampling_rate` setting from kong.conf.",
type = "number",
between = {0, 1},
required = false,
default = nil,
} },
{ propagation = typedefs.propagation {
default = {
default_format = "w3c",
},
} },
},
entity_checks = {
{ at_least_one_of = {
"traces_endpoint",
"logs_endpoint",
} },
},
shorthand_fields = {
-- TODO: deprecated fields, to be removed in Kong 4.0
{
endpoint = typedefs.url {
referenceable = true,
deprecation = {
message = "OpenTelemetry: config.endpoint is deprecated, please use config.traces_endpoint instead",
removal_in_version = "4.0", },
func = function(value)
return { traces_endpoint = value }
end,
},
},
}
}, },
},
}