OpenTelemetry Instrumentation Attributes
AppSignal supports multiple OpenTelemetry language integrations. However, the data model may not always align perfectly, which can affect how OpenTelemetry data is displayed in the AppSignal interface. By using the attributes listed on this page, you can customize the appearance of trace and span data.
Accessing a span
When customizing the trace or span, first import the OpenTelemetry trace module in the file you want to customize the reported trace data.
from opentelemetry import trace
Using that trace module, create a new span:
tracer = trace.get_tracer(__name__) with tracer.start_as_current_span("Span name") as span: # Set attribute values span.set_attribute("attribute name", "attribute value")
Or fetch the current active one:
span = trace.get_current_span() # Set attribute values span.set_attribute("attribute name", "attribute value")
AppSignal attributes
Namespace
- Attribute name:
appsignal.namespace
- Value type:
String
Group traces by namespace for better organization in the AppSignal interface.
Namespaces are grouped per OpenTelemetry service name with the format <Service name>/<Namespace>
, e.g. "Web server/admin" or "Background worker/billing". This attribute allows you to configure the namespace part only. The default namespace for all traces is <Service name>/default
.
span.set_attribute("appsignal.namespace", "admin")
span.SetAttributes(attribute.String("appsignal.namespace", "admin"))
Root action name
- Attribute name:
appsignal.action_name
- Value type:
String
Set the action name of the trace that will be used to create incidents and group tracing on AppSignal.com. This will overwrite any automated mapping done by the AppSignal support for specific instrumentation. It is useful for traces that are not created by supported libraries. If your trace is grouped with other not named or poorly grouped traces, it may be missing this attribute.
We aim to improve our automatic grouping over time, so please let us know when you find that this attribute is needed.
span.set_attribute("appsignal.action_name", "ControllerName#action")
span.SetAttributes(attribute.String("appsignal.action_name", "ControllerName#action"))
Tags
- Attribute name:
appsignal.tag.<tag_name>
- Value type:
String
Tag traces to bring them to the front on the trace detail pages and filter traces in the AppSignal interface. Multiple tags can be set on spans in a trace. Tags can be added to any span in a trace on any level on the trace.
The tag attribute key is built up out of two parts, the appsignal.tag
prefix, and the tag key. For the tag user_id
, this becomes appsignal.tag.user_id
as an attribute key.
span.set_attribute("appsignal.tag.<tag_name>", "string") # Example format span.set_attribute("appsignal.tag.user_id", user.id)
span.SetAttributes(attribute.String("appsignal.tag.<tag_name>", "string")) // Example format span.SetAttributes(attribute.String("appsignal.tag.user_id", user.id))
Function parameters
- Attribute name:
appsignal.function.parameters
- Value type: JSON serialized object
Report the parameters for a function call using this attribute. Use this to set parameters given to a background job, a task or function call you'd like to track.
The values set in this span attribute can be filtered using the appsignal.config.filter_function_parameters
config option.
span.set_attribute("appsignal.function.parameters", json.dumps({ "param1": "value1", "param2": "value2" }))
import ( "encoding/json" ) params := map[string]interface{}{ "param1": "value1", "param2": "value2", "nested": map[string]interface{}{ "param3": "value3", "param4": "value4", }, } json, _ := json.Marshal(params) span.SetAttributes(attribute.String("appsignal.function.parameters", string(json)))
Response headers
- Attribute name:
http.response.header.<key>
- Value type: Array of Strings
Report the response's headers using an OpenTelemetry span attribute. This span attribute is also documented on the OpenTelemetry HTTP span specification.
span.set_attribute("http.response.header.content-type", ["application/json"]) span.set_attribute("http.response.header.custom-header", ["abc", "def"])
span.SetAttributes(attribute.StringSlice("http.response.header.content-type", []string{"application/json"})) span.SetAttributes(attribute.StringSlice("http.response.header.custom-header", []string{"abc", "def"}))
Request headers
- Attribute name:
http.request.header.<key>
- Value type: Array of Strings
Report the request's headers using an OpenTelemetry span attribute. This span attribute is also documented on the OpenTelemetry HTTP span specification.
span.set_attribute("http.request.header.content-type", ["application/json"]) span.set_attribute("http.request.header.custom-header", ["abc", "def"])
span.SetAttributes(attribute.StringSlice("http.request.header.content-type", []string{"application/json"})) span.SetAttributes(attribute.StringSlice("http.request.header.custom-header"), []string{"abc", "def"})
Request query parameters
- Attribute name:
appsignal.request.query_parameters
- Value type: JSON serialized object
Report an incoming HTTP request's query parameters using this attribute.
The values set in this span attribute can be filtered using the appsignal.config.filter_request_query_parameters
config option.
span.set_attribute("appsignal.request.query_parameters", json.dumps({ "category": "shoes", "filter": "color:blue" }))
import ( "encoding/json" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" ) params := map[string]interface{}{ "param1": "value1", "param2": "value2", "nested": map[string]interface{}{ "param3": "value3", "param4": "value4", }, } json, _ := json.Marshal(params) span.SetAttributes(attribute.String("appsignal.request.query_parameters", string(json)))
Request payload
- Attribute name:
appsignal.request.payload
- Value type: JSON serialized object
Report an incoming HTTP request's payload using this attribute.
The values set in this span attribute can be filtered using the appsignal.config.filter_request_payload
config option.
span.set_attribute("appsignal.request.payload", json.dumps({ "title": "My new blog post" "body": "Lorem ipsum" }))
import ( "encoding/json" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" ) payload := map[string]interface{}{ "param1": "value1", "param2": "value2", "nested": map[string]interface{}{ "param3": "value3", "param4": "value4", }, } json, _ := json.Marshal(payload) span.SetAttributes(attribute.String("appsignal.request.payload", string(json)))
Request session data
- Attribute name:
appsignal.request.session_data
- Value type: JSON serialized object
Report an incoming HTTP request's session data using this attribute.
The values set in this span attribute can be filtered using the appsignal.config.filter_request_session_data
config option.
span.set_attribute("appsignal.request.session_data", json.dumps({ "user_id": 123 "theme": "dark" }))
import ( "encoding/json" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" ) session_data := map[string]interface{}{ "param1": "value1", "param2": "value2", "nested": map[string]interface{}{ "param3": "value3", "param4": "value4", }, } json, _ := json.Marshal(session_data) span.SetAttributes(attribute.String("appsignal.request.session_data", string(json)))