[{"data":1,"prerenderedAt":1677},["ShallowReactive",2],{"\u002Fguides\u002Fopentelemetry-openai-navigation":3,"\u002Fguides\u002Fopentelemetry-openai":200,"$Vs9m8Q-E34":1577},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196],{"title":5,"path":6,"stem":7},"Guides","\u002Fguides","guides\u002Findex",{"title":9,"path":10,"stem":11},"OpenTelemetry Beego monitoring [otelbeego]","\u002Fguides\u002Fopentelemetry-beego","guides\u002Fopentelemetry-beego",{"title":13,"path":14,"stem":15},"OpenTelemetry Celery Instrumentation Guide","\u002Fguides\u002Fopentelemetry-celery","guides\u002Fopentelemetry-celery",{"title":17,"path":18,"stem":19},"Instrumenting Go database\u002Fsql with OpenTelemetry [otelsql]","\u002Fguides\u002Fopentelemetry-database-sql","guides\u002Fopentelemetry-database-sql",{"title":21,"path":22,"stem":23},"Django OpenTelemetry Instrumentation and Monitoring","\u002Fguides\u002Fopentelemetry-django","guides\u002Fopentelemetry-django",{"title":25,"path":26,"stem":27},"OpenTelemetry Docker Monitoring with Collector and Docker Stats","\u002Fguides\u002Fopentelemetry-docker","guides\u002Fopentelemetry-docker",{"title":29,"path":30,"stem":31},"OpenTelemetry Echo by Labstack [otelecho]","\u002Fguides\u002Fopentelemetry-echo","guides\u002Fopentelemetry-echo",{"title":33,"path":34,"stem":35},"OpenTelemetry Go Ent monitoring [otelent]","\u002Fguides\u002Fopentelemetry-ent","guides\u002Fopentelemetry-ent",{"title":37,"path":38,"stem":39},"OpenTelemetry Express.js instrumentation","\u002Fguides\u002Fopentelemetry-express","guides\u002Fopentelemetry-express",{"title":41,"path":42,"stem":43},"OpenTelemetry Falcon Instrumentation and Monitoring","\u002Fguides\u002Fopentelemetry-falcon","guides\u002Fopentelemetry-falcon",{"title":45,"path":46,"stem":47},"OpenTelemetry FastAPI Instrumentation and Monitoring","\u002Fguides\u002Fopentelemetry-fastapi","guides\u002Fopentelemetry-fastapi",{"title":49,"path":50,"stem":51},"OpenTelemetry Filelog Receiver","\u002Fguides\u002Fopentelemetry-filelog-receiver","guides\u002Fopentelemetry-filelog-receiver",{"title":53,"path":54,"stem":55},"OpenTelemetry Flask Instrumentation and Monitoring","\u002Fguides\u002Fopentelemetry-flask","guides\u002Fopentelemetry-flask",{"title":57,"path":58,"stem":59},"OpenTelemetry Gin Monitoring [otelgin]","\u002Fguides\u002Fopentelemetry-gin","guides\u002Fopentelemetry-gin",{"title":61,"path":62,"stem":63},"OpenTelemetry Golang gRPC monitoring [otelgrpc]","\u002Fguides\u002Fopentelemetry-go-grpc","guides\u002Fopentelemetry-go-grpc",{"title":65,"path":66,"stem":67},"OpenTelemetry Go AWS Lambda Instrumentation","\u002Fguides\u002Fopentelemetry-go-lambda","guides\u002Fopentelemetry-go-lambda",{"title":69,"path":70,"stem":71},"OpenTelemetry Go-Zero monitoring [otelzero]","\u002Fguides\u002Fopentelemetry-go-zero","guides\u002Fopentelemetry-go-zero",{"title":73,"path":74,"stem":75},"OpenTelemetry Gorilla Mux monitoring [otelmux]","\u002Fguides\u002Fopentelemetry-gorilla-mux","guides\u002Fopentelemetry-gorilla-mux",{"title":77,"path":78,"stem":79},"OpenTelemetry GORM monitoring [otelgorm]","\u002Fguides\u002Fopentelemetry-gorm","guides\u002Fopentelemetry-gorm",{"title":81,"path":82,"stem":83},"OpenTelemetry HTTPcheck Receiver","\u002Fguides\u002Fopentelemetry-httpcheck","guides\u002Fopentelemetry-httpcheck",{"title":85,"path":86,"stem":87},"OpenTelemetry Kubernetes Events Receiver [k8seventsreceiver]","\u002Fguides\u002Fopentelemetry-k8seventsreceiver","guides\u002Fopentelemetry-k8seventsreceiver",{"title":89,"path":90,"stem":91},"Kafka Monitoring with OpenTelemetry Collector","\u002Fguides\u002Fopentelemetry-kafka","guides\u002Fopentelemetry-kafka",{"title":93,"path":94,"stem":95},"OpenTelemetry Integration for Laravel: Full Guide","\u002Fguides\u002Fopentelemetry-laravel","guides\u002Fopentelemetry-laravel",{"title":97,"path":98,"stem":99},"OpenTelemetry Log4j logs [Java]","\u002Fguides\u002Fopentelemetry-log4j","guides\u002Fopentelemetry-log4j",{"title":101,"path":102,"stem":103},"OpenTelemetry Logback logging [Java]","\u002Fguides\u002Fopentelemetry-logback","guides\u002Fopentelemetry-logback",{"title":105,"path":106,"stem":107},"OpenTelemetry Logrus logs [otellogrus]","\u002Fguides\u002Fopentelemetry-logrus","guides\u002Fopentelemetry-logrus",{"title":109,"path":110,"stem":111},"OpenTelemetry MySQL Monitoring [step by step]","\u002Fguides\u002Fopentelemetry-mysql","guides\u002Fopentelemetry-mysql",{"title":113,"path":114,"stem":115},"OpenTelemetry Go net\u002Fhttp Instrumentation [otelhttp]","\u002Fguides\u002Fopentelemetry-net-http","guides\u002Fopentelemetry-net-http",{"title":117,"path":118,"stem":119},"OpenTelemetry Next.js Instrumentation","\u002Fguides\u002Fopentelemetry-nextjs","guides\u002Fopentelemetry-nextjs",{"title":121,"path":122,"stem":123},"OpenTelemetry NGINX Instrumentation","\u002Fguides\u002Fopentelemetry-nginx","guides\u002Fopentelemetry-nginx",{"title":125,"path":126,"stem":127},"OpenTelemetry Node.js AWS Lambda","\u002Fguides\u002Fopentelemetry-node-lambda","guides\u002Fopentelemetry-node-lambda",{"title":129,"path":130,"stem":131},"OpenTelemetry OpenAI Instrumentation","\u002Fguides\u002Fopentelemetry-openai","guides\u002Fopentelemetry-openai",{"title":133,"path":134,"stem":135},"OpenTelemetry Phoenix monitoring","\u002Fguides\u002Fopentelemetry-phoenix","guides\u002Fopentelemetry-phoenix",{"title":137,"path":138,"stem":139},"PHP-FPM Monitoring with OpenTelemetry: Metrics, Alerts, and Dashboards","\u002Fguides\u002Fopentelemetry-php-fpm","guides\u002Fopentelemetry-php-fpm",{"title":141,"path":142,"stem":143},"OpenTelemetry PostgreSQL Monitoring","\u002Fguides\u002Fopentelemetry-postgresql","guides\u002Fopentelemetry-postgresql",{"title":145,"path":146,"stem":147},"OpenTelemetry Pyramid: Instrumentation and Monitoring Guide","\u002Fguides\u002Fopentelemetry-pyramid","guides\u002Fopentelemetry-pyramid",{"title":149,"path":150,"stem":151},"OpenTelemetry Quarkus Instrumentation [Java]","\u002Fguides\u002Fopentelemetry-quarkus","guides\u002Fopentelemetry-quarkus",{"title":153,"path":154,"stem":155},"OpenTelemetry RabbitMQ Monitoring Guide","\u002Fguides\u002Fopentelemetry-rabbitmq","guides\u002Fopentelemetry-rabbitmq",{"title":157,"path":158,"stem":159},"Ruby on Rails Application Monitoring with OpenTelemetry","\u002Fguides\u002Fopentelemetry-rails","guides\u002Fopentelemetry-rails",{"title":161,"path":162,"stem":163},"Monitor Redis with OpenTelemetry Collector","\u002Fguides\u002Fopentelemetry-redis","guides\u002Fopentelemetry-redis",{"title":165,"path":166,"stem":167},"OpenTelemetry Sinatra monitoring","\u002Fguides\u002Fopentelemetry-sinatra","guides\u002Fopentelemetry-sinatra",{"title":169,"path":170,"stem":171},"OpenTelemetry Slim Framework: Instrumentation and Monitoring Guide","\u002Fguides\u002Fopentelemetry-slim","guides\u002Fopentelemetry-slim",{"title":173,"path":174,"stem":175},"OpenTelemetry Slog [otelslog]: Golang Bridge Setup & Examples","\u002Fguides\u002Fopentelemetry-slog","guides\u002Fopentelemetry-slog",{"title":177,"path":178,"stem":179},"OpenTelemetry for Spring Boot: Guide with Examples","\u002Fguides\u002Fopentelemetry-spring-boot","guides\u002Fopentelemetry-spring-boot",{"title":181,"path":182,"stem":183},"OpenTelemetry SQLAlchemy monitoring","\u002Fguides\u002Fopentelemetry-sqlalchemy","guides\u002Fopentelemetry-sqlalchemy",{"title":185,"path":186,"stem":187},"OpenTelemetry Integration for Symfony: Full Guide","\u002Fguides\u002Fopentelemetry-symfony","guides\u002Fopentelemetry-symfony",{"title":189,"path":190,"stem":191},"OpenTelemetry Syslog Receiver","\u002Fguides\u002Fopentelemetry-syslog-receiver","guides\u002Fopentelemetry-syslog-receiver",{"title":193,"path":194,"stem":195},"OpenTelemetry Tomcat: Instrumentation and Monitoring Guide","\u002Fguides\u002Fopentelemetry-tomcat","guides\u002Fopentelemetry-tomcat",{"title":197,"path":198,"stem":199},"OpenTelemetry Zap [otelzap]: Golang Logging Bridge Setup & Examples","\u002Fguides\u002Fopentelemetry-zap","guides\u002Fopentelemetry-zap",{"page":201,"surround":1572},{"id":202,"title":129,"author":203,"author_site":204,"body":205,"date":1559,"description":1560,"extension":1561,"image":1562,"meta":1563,"navigation":334,"path":130,"seo":1570,"stem":131,"__hash__":1571},"guides\u002Fguides\u002Fopentelemetry-openai.md","abandurchin",null,{"type":206,"value":207,"toc":1548},"minimark",[208,218,223,295,301,451,461,482,486,489,610,631,635,643,646,833,836,840,843,860,863,867,870,987,991,994,1202,1213,1217,1220,1337,1341,1356,1418,1433,1437,1444,1538,1544],[209,210,211,212,217],"p",{},"By adding OpenTelemetry instrumentation to the OpenAI SDK, you get automatic tracing for every API call — model name, token usage, finish reason, and errors — without modifying your existing OpenAI code. This data flows into any ",[213,214,216],"a",{"href":215},"\u002Fopentelemetry\u002Fapm","OpenTelemetry APM"," including Uptrace.",[219,220,222],"h2",{"id":221},"quick-setup","Quick Setup",[224,225,226,242],"table",{},[227,228,229],"thead",{},[230,231,232,236,239],"tr",{},[233,234,235],"th",{},"Step",[233,237,238],{},"Action",[233,240,241],{},"Code\u002FCommand",[243,244,245,260,273,284],"tbody",{},[230,246,247,251,254],{},[248,249,250],"td",{},"1. Install",[248,252,253],{},"Install the official OTel instrumentation package",[248,255,256],{},[257,258,259],"code",{},"pip install opentelemetry-instrumentation-openai-v2",[230,261,262,265,268],{},[248,263,264],{},"2. Instrument",[248,266,267],{},"Call instrument() before any OpenAI calls",[248,269,270],{},[257,271,272],{},"OpenAIInstrumentor().instrument()",[230,274,275,278,281],{},[248,276,277],{},"3. Configure",[248,279,280],{},"Point the exporter at your backend",[248,282,283],{},"See exporter setup below",[230,285,286,289,292],{},[248,287,288],{},"4. Run",[248,290,291],{},"Make OpenAI calls as normal",[248,293,294],{},"Spans captured automatically",[209,296,297],{},[298,299,300],"strong",{},"Minimal working example:",[302,303,308],"pre",{"className":304,"code":305,"language":306,"meta":307,"style":307},"language-python shiki shiki-themes github-light","from opentelemetry.instrumentation.openai_v2 import OpenAIInstrumentor\n\n# Call once at application startup, before any OpenAI API calls\nOpenAIInstrumentor().instrument()\n\nfrom openai import OpenAI\nclient = OpenAI()\n\nresponse = client.chat.completions.create(\n    model=\"gpt-5\",\n    messages=[{\"role\": \"user\", \"content\": \"What is OpenTelemetry?\"}]\n)\n","python","",[257,309,310,329,336,343,349,354,367,379,384,395,411,445],{"__ignoreMap":307},[311,312,315,319,323,326],"span",{"class":313,"line":314},"line",1,[311,316,318],{"class":317},"sD7c4","from",[311,320,322],{"class":321},"sgsFI"," opentelemetry.instrumentation.openai_v2 ",[311,324,325],{"class":317},"import",[311,327,328],{"class":321}," OpenAIInstrumentor\n",[311,330,332],{"class":313,"line":331},2,[311,333,335],{"emptyLinePlaceholder":334},true,"\n",[311,337,339],{"class":313,"line":338},3,[311,340,342],{"class":341},"sAwPA","# Call once at application startup, before any OpenAI API calls\n",[311,344,346],{"class":313,"line":345},4,[311,347,348],{"class":321},"OpenAIInstrumentor().instrument()\n",[311,350,352],{"class":313,"line":351},5,[311,353,335],{"emptyLinePlaceholder":334},[311,355,357,359,362,364],{"class":313,"line":356},6,[311,358,318],{"class":317},[311,360,361],{"class":321}," openai ",[311,363,325],{"class":317},[311,365,366],{"class":321}," OpenAI\n",[311,368,370,373,376],{"class":313,"line":369},7,[311,371,372],{"class":321},"client ",[311,374,375],{"class":317},"=",[311,377,378],{"class":321}," OpenAI()\n",[311,380,382],{"class":313,"line":381},8,[311,383,335],{"emptyLinePlaceholder":334},[311,385,387,390,392],{"class":313,"line":386},9,[311,388,389],{"class":321},"response ",[311,391,375],{"class":317},[311,393,394],{"class":321}," client.chat.completions.create(\n",[311,396,398,402,404,408],{"class":313,"line":397},10,[311,399,401],{"class":400},"sqxcx","    model",[311,403,375],{"class":317},[311,405,407],{"class":406},"sYBdl","\"gpt-5\"",[311,409,410],{"class":321},",\n",[311,412,414,417,419,422,425,428,431,434,437,439,442],{"class":313,"line":413},11,[311,415,416],{"class":400},"    messages",[311,418,375],{"class":317},[311,420,421],{"class":321},"[{",[311,423,424],{"class":406},"\"role\"",[311,426,427],{"class":321},": ",[311,429,430],{"class":406},"\"user\"",[311,432,433],{"class":321},", ",[311,435,436],{"class":406},"\"content\"",[311,438,427],{"class":321},[311,440,441],{"class":406},"\"What is OpenTelemetry?\"",[311,443,444],{"class":321},"}]\n",[311,446,448],{"class":313,"line":447},12,[311,449,450],{"class":321},")\n",[209,452,453,454,433,457,460],{},"This single call automatically creates a span for every ",[257,455,456],{},"client.chat.completions.create()",[257,458,459],{},"client.embeddings.create()",", and other OpenAI SDK operations your code makes.",[462,463,464],"blockquote",{},[209,465,466,469,470,473,474,477,478,481],{},[298,467,468],{},"Two packages exist."," ",[257,471,472],{},"opentelemetry-instrumentation-openai-v2"," is the official OpenTelemetry implementation (maintained in the opentelemetry-python-contrib repo). The older ",[257,475,476],{},"opentelemetry-instrumentation-openai"," is a community package by Traceloop\u002FOpenLLMetry — still maintained but not the OTel standard. Use the ",[257,479,480],{},"-v2"," package for new projects.",[219,483,485],{"id":484},"what-gets-captured","What Gets Captured",[209,487,488],{},"The instrumentation populates standard OpenTelemetry GenAI semantic convention attributes on each span:",[224,490,491,504],{},[227,492,493],{},[230,494,495,498,501],{},[233,496,497],{},"Attribute",[233,499,500],{},"Example value",[233,502,503],{},"Description",[243,505,506,521,536,551,565,580,595],{},[230,507,508,513,518],{},[248,509,510],{},[257,511,512],{},"gen_ai.system",[248,514,515],{},[257,516,517],{},"openai",[248,519,520],{},"AI provider",[230,522,523,528,533],{},[248,524,525],{},[257,526,527],{},"gen_ai.operation.name",[248,529,530],{},[257,531,532],{},"chat",[248,534,535],{},"Operation type",[230,537,538,543,548],{},[248,539,540],{},[257,541,542],{},"gen_ai.request.model",[248,544,545],{},[257,546,547],{},"gpt-5",[248,549,550],{},"Requested model",[230,552,553,558,562],{},[248,554,555],{},[257,556,557],{},"gen_ai.response.model",[248,559,560],{},[257,561,547],{},[248,563,564],{},"Actual model version returned by API",[230,566,567,572,577],{},[248,568,569],{},[257,570,571],{},"gen_ai.usage.input_tokens",[248,573,574],{},[257,575,576],{},"142",[248,578,579],{},"Prompt tokens consumed",[230,581,582,587,592],{},[248,583,584],{},[257,585,586],{},"gen_ai.usage.output_tokens",[248,588,589],{},[257,590,591],{},"38",[248,593,594],{},"Completion tokens generated",[230,596,597,602,607],{},[248,598,599],{},[257,600,601],{},"gen_ai.response.finish_reason",[248,603,604],{},[257,605,606],{},"stop",[248,608,609],{},"Why generation ended",[209,611,612,613,619,620,622,623,625,626,630],{},"These attributes follow the ",[213,614,618],{"href":615,"rel":616},"https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Fspecs\u002Fsemconv\u002Fgen-ai\u002F",[617],"nofollow","OpenTelemetry GenAI semantic conventions"," and are supported by Uptrace, Datadog (v1.37+), and Grafana. The ",[257,621,571],{}," and ",[257,624,586],{}," values are the foundation for ",[213,627,629],{"href":628},"\u002Fblog\u002Fllm-cost-monitoring","LLM cost monitoring"," — multiply them by model price per token to get per-request spend.",[219,632,634],{"id":633},"full-setup-with-otlp-exporter","Full Setup with OTLP Exporter",[462,636,637],{},[209,638,639,642],{},[298,640,641],{},"Note on Examples:"," This guide uses Uptrace as the OpenTelemetry backend in code examples. OpenTelemetry is vendor-neutral and works with any OTLP-compatible backend (Jaeger, Grafana Tempo, Prometheus, etc.). Simply replace the endpoint and headers with your preferred backend configuration.",[209,644,645],{},"A complete setup configures the SDK, adds a span processor, and instruments OpenAI before your application logic runs:",[302,647,649],{"className":304,"code":648,"language":306,"meta":307,"style":307},"import os\nfrom opentelemetry import trace\nfrom opentelemetry.sdk.trace import TracerProvider\nfrom opentelemetry.sdk.trace.export import BatchSpanProcessor\nfrom opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter\nfrom opentelemetry.instrumentation.openai_v2 import OpenAIInstrumentor\n\ndef setup_tracing():\n    exporter = OTLPSpanExporter(\n        endpoint=os.environ[\"OTLP_ENDPOINT\"],   # e.g. https:\u002F\u002Fapi.uptrace.dev:4317\n        headers={\"uptrace-dsn\": os.environ[\"UPTRACE_DSN\"]},\n    )\n    provider = TracerProvider()\n    provider.add_span_processor(BatchSpanProcessor(exporter))\n    trace.set_tracer_provider(provider)\n\n    OpenAIInstrumentor().instrument()\n\nsetup_tracing()\n",[257,650,651,658,670,682,694,706,716,720,732,742,761,783,788,799,805,811,816,822,827],{"__ignoreMap":307},[311,652,653,655],{"class":313,"line":314},[311,654,325],{"class":317},[311,656,657],{"class":321}," os\n",[311,659,660,662,665,667],{"class":313,"line":331},[311,661,318],{"class":317},[311,663,664],{"class":321}," opentelemetry ",[311,666,325],{"class":317},[311,668,669],{"class":321}," trace\n",[311,671,672,674,677,679],{"class":313,"line":338},[311,673,318],{"class":317},[311,675,676],{"class":321}," opentelemetry.sdk.trace ",[311,678,325],{"class":317},[311,680,681],{"class":321}," TracerProvider\n",[311,683,684,686,689,691],{"class":313,"line":345},[311,685,318],{"class":317},[311,687,688],{"class":321}," opentelemetry.sdk.trace.export ",[311,690,325],{"class":317},[311,692,693],{"class":321}," BatchSpanProcessor\n",[311,695,696,698,701,703],{"class":313,"line":351},[311,697,318],{"class":317},[311,699,700],{"class":321}," opentelemetry.exporter.otlp.proto.grpc.trace_exporter ",[311,702,325],{"class":317},[311,704,705],{"class":321}," OTLPSpanExporter\n",[311,707,708,710,712,714],{"class":313,"line":356},[311,709,318],{"class":317},[311,711,322],{"class":321},[311,713,325],{"class":317},[311,715,328],{"class":321},[311,717,718],{"class":313,"line":369},[311,719,335],{"emptyLinePlaceholder":334},[311,721,722,725,729],{"class":313,"line":381},[311,723,724],{"class":317},"def",[311,726,728],{"class":727},"s7eDp"," setup_tracing",[311,730,731],{"class":321},"():\n",[311,733,734,737,739],{"class":313,"line":386},[311,735,736],{"class":321},"    exporter ",[311,738,375],{"class":317},[311,740,741],{"class":321}," OTLPSpanExporter(\n",[311,743,744,747,749,752,755,758],{"class":313,"line":397},[311,745,746],{"class":400},"        endpoint",[311,748,375],{"class":317},[311,750,751],{"class":321},"os.environ[",[311,753,754],{"class":406},"\"OTLP_ENDPOINT\"",[311,756,757],{"class":321},"],   ",[311,759,760],{"class":341},"# e.g. https:\u002F\u002Fapi.uptrace.dev:4317\n",[311,762,763,766,768,771,774,777,780],{"class":313,"line":413},[311,764,765],{"class":400},"        headers",[311,767,375],{"class":317},[311,769,770],{"class":321},"{",[311,772,773],{"class":406},"\"uptrace-dsn\"",[311,775,776],{"class":321},": os.environ[",[311,778,779],{"class":406},"\"UPTRACE_DSN\"",[311,781,782],{"class":321},"]},\n",[311,784,785],{"class":313,"line":447},[311,786,787],{"class":321},"    )\n",[311,789,791,794,796],{"class":313,"line":790},13,[311,792,793],{"class":321},"    provider ",[311,795,375],{"class":317},[311,797,798],{"class":321}," TracerProvider()\n",[311,800,802],{"class":313,"line":801},14,[311,803,804],{"class":321},"    provider.add_span_processor(BatchSpanProcessor(exporter))\n",[311,806,808],{"class":313,"line":807},15,[311,809,810],{"class":321},"    trace.set_tracer_provider(provider)\n",[311,812,814],{"class":313,"line":813},16,[311,815,335],{"emptyLinePlaceholder":334},[311,817,819],{"class":313,"line":818},17,[311,820,821],{"class":321},"    OpenAIInstrumentor().instrument()\n",[311,823,825],{"class":313,"line":824},18,[311,826,335],{"emptyLinePlaceholder":334},[311,828,830],{"class":313,"line":829},19,[311,831,832],{"class":321},"setup_tracing()\n",[209,834,835],{},"After this, all OpenAI SDK calls in the process produce spans automatically — no changes to existing code required.",[219,837,839],{"id":838},"capturing-prompt-and-completion-content","Capturing Prompt and Completion Content",[209,841,842],{},"By default the instrumentation records token counts and metadata but not the actual message content, to avoid accidentally logging sensitive data. To capture prompts and completions as span events, set the environment variable before starting your application:",[302,844,848],{"className":845,"code":846,"language":847,"meta":307,"style":307},"language-bash shiki shiki-themes github-light","OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true\n","bash",[257,849,850],{"__ignoreMap":307},[311,851,852,855,857],{"class":313,"line":314},[311,853,854],{"class":321},"OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT",[311,856,375],{"class":317},[311,858,859],{"class":406},"true\n",[209,861,862],{},"With this enabled, each span gets log events containing the full input messages and the model's response text. Use this in development and debugging environments; evaluate carefully before enabling in production where prompts may contain PII.",[219,864,866],{"id":865},"streaming-responses","Streaming Responses",[209,868,869],{},"The instrumentation handles streaming responses. Token counts are recorded when the stream completes:",[302,871,873],{"className":304,"code":872,"language":306,"meta":307,"style":307},"with client.chat.completions.stream(\n    model=\"gpt-5\",\n    messages=[{\"role\": \"user\", \"content\": \"List 5 observability best practices\"}],\n) as stream:\n    for text in stream.text_stream:\n        print(text, end=\"\", flush=True)\n\n# gen_ai.usage.input_tokens and gen_ai.usage.output_tokens are\n# set on the span after the stream closes\n",[257,874,875,883,893,919,930,944,973,977,982],{"__ignoreMap":307},[311,876,877,880],{"class":313,"line":314},[311,878,879],{"class":317},"with",[311,881,882],{"class":321}," client.chat.completions.stream(\n",[311,884,885,887,889,891],{"class":313,"line":331},[311,886,401],{"class":400},[311,888,375],{"class":317},[311,890,407],{"class":406},[311,892,410],{"class":321},[311,894,895,897,899,901,903,905,907,909,911,913,916],{"class":313,"line":338},[311,896,416],{"class":400},[311,898,375],{"class":317},[311,900,421],{"class":321},[311,902,424],{"class":406},[311,904,427],{"class":321},[311,906,430],{"class":406},[311,908,433],{"class":321},[311,910,436],{"class":406},[311,912,427],{"class":321},[311,914,915],{"class":406},"\"List 5 observability best practices\"",[311,917,918],{"class":321},"}],\n",[311,920,921,924,927],{"class":313,"line":345},[311,922,923],{"class":321},") ",[311,925,926],{"class":317},"as",[311,928,929],{"class":321}," stream:\n",[311,931,932,935,938,941],{"class":313,"line":351},[311,933,934],{"class":317},"    for",[311,936,937],{"class":321}," text ",[311,939,940],{"class":317},"in",[311,942,943],{"class":321}," stream.text_stream:\n",[311,945,946,950,953,956,958,961,963,966,968,971],{"class":313,"line":356},[311,947,949],{"class":948},"sYu0t","        print",[311,951,952],{"class":321},"(text, ",[311,954,955],{"class":400},"end",[311,957,375],{"class":317},[311,959,960],{"class":406},"\"\"",[311,962,433],{"class":321},[311,964,965],{"class":400},"flush",[311,967,375],{"class":317},[311,969,970],{"class":948},"True",[311,972,450],{"class":321},[311,974,975],{"class":313,"line":369},[311,976,335],{"emptyLinePlaceholder":334},[311,978,979],{"class":313,"line":381},[311,980,981],{"class":341},"# gen_ai.usage.input_tokens and gen_ai.usage.output_tokens are\n",[311,983,984],{"class":313,"line":386},[311,985,986],{"class":341},"# set on the span after the stream closes\n",[219,988,990],{"id":989},"adding-custom-attributes","Adding Custom Attributes",[209,992,993],{},"For context beyond what the auto-instrumentation captures — user ID, feature flag, request source — add attributes to the current span:",[302,995,997],{"className":304,"code":996,"language":306,"meta":307,"style":307},"from opentelemetry import trace\n\ntracer = trace.get_tracer(__name__)\n\ndef generate_summary(text: str, user_id: str) -> str:\n    with tracer.start_as_current_span(\"summarize\") as span:\n        span.set_attribute(\"app.user_id\", user_id)\n        span.set_attribute(\"app.input_length\", len(text))\n\n        response = client.chat.completions.create(\n            model=\"gpt-5.4-nano\",\n            messages=[\n                {\"role\": \"system\", \"content\": \"Summarize the following text.\"},\n                {\"role\": \"user\", \"content\": text},\n            ]\n        )\n        return response.choices[0].message.content\n",[257,998,999,1009,1013,1028,1032,1058,1076,1087,1102,1106,1115,1127,1137,1161,1178,1183,1188],{"__ignoreMap":307},[311,1000,1001,1003,1005,1007],{"class":313,"line":314},[311,1002,318],{"class":317},[311,1004,664],{"class":321},[311,1006,325],{"class":317},[311,1008,669],{"class":321},[311,1010,1011],{"class":313,"line":331},[311,1012,335],{"emptyLinePlaceholder":334},[311,1014,1015,1018,1020,1023,1026],{"class":313,"line":338},[311,1016,1017],{"class":321},"tracer ",[311,1019,375],{"class":317},[311,1021,1022],{"class":321}," trace.get_tracer(",[311,1024,1025],{"class":948},"__name__",[311,1027,450],{"class":321},[311,1029,1030],{"class":313,"line":345},[311,1031,335],{"emptyLinePlaceholder":334},[311,1033,1034,1036,1039,1042,1045,1048,1050,1053,1055],{"class":313,"line":351},[311,1035,724],{"class":317},[311,1037,1038],{"class":727}," generate_summary",[311,1040,1041],{"class":321},"(text: ",[311,1043,1044],{"class":948},"str",[311,1046,1047],{"class":321},", user_id: ",[311,1049,1044],{"class":948},[311,1051,1052],{"class":321},") -> ",[311,1054,1044],{"class":948},[311,1056,1057],{"class":321},":\n",[311,1059,1060,1063,1066,1069,1071,1073],{"class":313,"line":356},[311,1061,1062],{"class":317},"    with",[311,1064,1065],{"class":321}," tracer.start_as_current_span(",[311,1067,1068],{"class":406},"\"summarize\"",[311,1070,923],{"class":321},[311,1072,926],{"class":317},[311,1074,1075],{"class":321}," span:\n",[311,1077,1078,1081,1084],{"class":313,"line":369},[311,1079,1080],{"class":321},"        span.set_attribute(",[311,1082,1083],{"class":406},"\"app.user_id\"",[311,1085,1086],{"class":321},", user_id)\n",[311,1088,1089,1091,1094,1096,1099],{"class":313,"line":381},[311,1090,1080],{"class":321},[311,1092,1093],{"class":406},"\"app.input_length\"",[311,1095,433],{"class":321},[311,1097,1098],{"class":948},"len",[311,1100,1101],{"class":321},"(text))\n",[311,1103,1104],{"class":313,"line":386},[311,1105,335],{"emptyLinePlaceholder":334},[311,1107,1108,1111,1113],{"class":313,"line":397},[311,1109,1110],{"class":321},"        response ",[311,1112,375],{"class":317},[311,1114,394],{"class":321},[311,1116,1117,1120,1122,1125],{"class":313,"line":413},[311,1118,1119],{"class":400},"            model",[311,1121,375],{"class":317},[311,1123,1124],{"class":406},"\"gpt-5.4-nano\"",[311,1126,410],{"class":321},[311,1128,1129,1132,1134],{"class":313,"line":447},[311,1130,1131],{"class":400},"            messages",[311,1133,375],{"class":317},[311,1135,1136],{"class":321},"[\n",[311,1138,1139,1142,1144,1146,1149,1151,1153,1155,1158],{"class":313,"line":790},[311,1140,1141],{"class":321},"                {",[311,1143,424],{"class":406},[311,1145,427],{"class":321},[311,1147,1148],{"class":406},"\"system\"",[311,1150,433],{"class":321},[311,1152,436],{"class":406},[311,1154,427],{"class":321},[311,1156,1157],{"class":406},"\"Summarize the following text.\"",[311,1159,1160],{"class":321},"},\n",[311,1162,1163,1165,1167,1169,1171,1173,1175],{"class":313,"line":801},[311,1164,1141],{"class":321},[311,1166,424],{"class":406},[311,1168,427],{"class":321},[311,1170,430],{"class":406},[311,1172,433],{"class":321},[311,1174,436],{"class":406},[311,1176,1177],{"class":321},": text},\n",[311,1179,1180],{"class":313,"line":807},[311,1181,1182],{"class":321},"            ]\n",[311,1184,1185],{"class":313,"line":813},[311,1186,1187],{"class":321},"        )\n",[311,1189,1190,1193,1196,1199],{"class":313,"line":818},[311,1191,1192],{"class":317},"        return",[311,1194,1195],{"class":321}," response.choices[",[311,1197,1198],{"class":948},"0",[311,1200,1201],{"class":321},"].message.content\n",[209,1203,1204,1205,1208,1209,1212],{},"The auto-instrumented ",[257,1206,1207],{},"gen_ai.*"," attributes appear as child spans under ",[257,1210,1211],{},"summarize",", giving you both application context and model-level detail in the same trace.",[219,1214,1216],{"id":1215},"async-support","Async Support",[209,1218,1219],{},"The instrumentation works with the async OpenAI client without additional configuration:",[302,1221,1223],{"className":304,"code":1222,"language":306,"meta":307,"style":307},"from openai import AsyncOpenAI\n\nasync_client = AsyncOpenAI()\n\nasync def async_chat(prompt: str) -> str:\n    response = await async_client.chat.completions.create(\n        model=\"gpt-5\",\n        messages=[{\"role\": \"user\", \"content\": prompt}]\n    )\n    return response.choices[0].message.content\n",[257,1224,1225,1236,1240,1250,1254,1276,1289,1300,1322,1326],{"__ignoreMap":307},[311,1226,1227,1229,1231,1233],{"class":313,"line":314},[311,1228,318],{"class":317},[311,1230,361],{"class":321},[311,1232,325],{"class":317},[311,1234,1235],{"class":321}," AsyncOpenAI\n",[311,1237,1238],{"class":313,"line":331},[311,1239,335],{"emptyLinePlaceholder":334},[311,1241,1242,1245,1247],{"class":313,"line":338},[311,1243,1244],{"class":321},"async_client ",[311,1246,375],{"class":317},[311,1248,1249],{"class":321}," AsyncOpenAI()\n",[311,1251,1252],{"class":313,"line":345},[311,1253,335],{"emptyLinePlaceholder":334},[311,1255,1256,1259,1262,1265,1268,1270,1272,1274],{"class":313,"line":351},[311,1257,1258],{"class":317},"async",[311,1260,1261],{"class":317}," def",[311,1263,1264],{"class":727}," async_chat",[311,1266,1267],{"class":321},"(prompt: ",[311,1269,1044],{"class":948},[311,1271,1052],{"class":321},[311,1273,1044],{"class":948},[311,1275,1057],{"class":321},[311,1277,1278,1281,1283,1286],{"class":313,"line":356},[311,1279,1280],{"class":321},"    response ",[311,1282,375],{"class":317},[311,1284,1285],{"class":317}," await",[311,1287,1288],{"class":321}," async_client.chat.completions.create(\n",[311,1290,1291,1294,1296,1298],{"class":313,"line":369},[311,1292,1293],{"class":400},"        model",[311,1295,375],{"class":317},[311,1297,407],{"class":406},[311,1299,410],{"class":321},[311,1301,1302,1305,1307,1309,1311,1313,1315,1317,1319],{"class":313,"line":381},[311,1303,1304],{"class":400},"        messages",[311,1306,375],{"class":317},[311,1308,421],{"class":321},[311,1310,424],{"class":406},[311,1312,427],{"class":321},[311,1314,430],{"class":406},[311,1316,433],{"class":321},[311,1318,436],{"class":406},[311,1320,1321],{"class":321},": prompt}]\n",[311,1323,1324],{"class":313,"line":386},[311,1325,787],{"class":321},[311,1327,1328,1331,1333,1335],{"class":313,"line":397},[311,1329,1330],{"class":317},"    return",[311,1332,1195],{"class":321},[311,1334,1198],{"class":948},[311,1336,1201],{"class":321},[219,1338,1340],{"id":1339},"sending-traces-to-uptrace","Sending Traces to Uptrace",[209,1342,1343,1344,1346,1347,1350,1351,1355],{},"Uptrace accepts OpenAI traces via OTLP and stores ",[257,1345,1207],{}," attributes as queryable fields. Find your DSN under ",[298,1348,1349],{},"Project Settings → Connection details"," in the ",[213,1352,1354],{"href":1353},"\u002Fget","Uptrace dashboard",":",[302,1357,1359],{"className":304,"code":1358,"language":306,"meta":307,"style":307},"from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter\n\nexporter = OTLPSpanExporter(\n    endpoint=\"https:\u002F\u002Fapi.uptrace.dev:4317\",\n    headers={\"uptrace-dsn\": \"https:\u002F\u002F\u003Ctoken>@api.uptrace.dev?grpc=4317\"},\n)\n",[257,1360,1361,1371,1375,1384,1396,1414],{"__ignoreMap":307},[311,1362,1363,1365,1367,1369],{"class":313,"line":314},[311,1364,318],{"class":317},[311,1366,700],{"class":321},[311,1368,325],{"class":317},[311,1370,705],{"class":321},[311,1372,1373],{"class":313,"line":331},[311,1374,335],{"emptyLinePlaceholder":334},[311,1376,1377,1380,1382],{"class":313,"line":338},[311,1378,1379],{"class":321},"exporter ",[311,1381,375],{"class":317},[311,1383,741],{"class":321},[311,1385,1386,1389,1391,1394],{"class":313,"line":345},[311,1387,1388],{"class":400},"    endpoint",[311,1390,375],{"class":317},[311,1392,1393],{"class":406},"\"https:\u002F\u002Fapi.uptrace.dev:4317\"",[311,1395,410],{"class":321},[311,1397,1398,1401,1403,1405,1407,1409,1412],{"class":313,"line":351},[311,1399,1400],{"class":400},"    headers",[311,1402,375],{"class":317},[311,1404,770],{"class":321},[311,1406,773],{"class":406},[311,1408,427],{"class":321},[311,1410,1411],{"class":406},"\"https:\u002F\u002F\u003Ctoken>@api.uptrace.dev?grpc=4317\"",[311,1413,1160],{"class":321},[311,1415,1416],{"class":313,"line":356},[311,1417,450],{"class":321},[209,1419,1420,1421,1423,1424,1427,1428,1432],{},"In Uptrace you can filter traces by ",[257,1422,542],{},", group by model to compare token usage, and sum ",[257,1425,1426],{},"gen_ai.usage.input_tokens + gen_ai.usage.output_tokens"," per trace to track consumption over time. If you're using LangChain, combine this setup with the ",[213,1429,1431],{"href":1430},"\u002Fblog\u002Flangchain-observability","LangChain observability guide"," to trace chain and agent structure alongside individual OpenAI calls.",[219,1434,1436],{"id":1435},"javascript-typescript","JavaScript \u002F TypeScript",[209,1438,1439,1440,1443],{},"The equivalent package for Node.js is ",[257,1441,1442],{},"@opentelemetry\u002Finstrumentation-openai"," (community maintained):",[302,1445,1449],{"className":1446,"code":1447,"language":1448,"meta":307,"style":307},"language-typescript shiki shiki-themes github-light","import { OpenAIInstrumentation } from '@opentelemetry\u002Finstrumentation-openai';\nimport { NodeSDK } from '@opentelemetry\u002Fsdk-node';\n\nconst sdk = new NodeSDK({\n  instrumentations: [new OpenAIInstrumentation()],\n});\n\nsdk.start();\n","typescript",[257,1450,1451,1466,1480,1484,1504,1518,1523,1527],{"__ignoreMap":307},[311,1452,1453,1455,1458,1460,1463],{"class":313,"line":314},[311,1454,325],{"class":317},[311,1456,1457],{"class":321}," { OpenAIInstrumentation } ",[311,1459,318],{"class":317},[311,1461,1462],{"class":406}," '@opentelemetry\u002Finstrumentation-openai'",[311,1464,1465],{"class":321},";\n",[311,1467,1468,1470,1473,1475,1478],{"class":313,"line":331},[311,1469,325],{"class":317},[311,1471,1472],{"class":321}," { NodeSDK } ",[311,1474,318],{"class":317},[311,1476,1477],{"class":406}," '@opentelemetry\u002Fsdk-node'",[311,1479,1465],{"class":321},[311,1481,1482],{"class":313,"line":338},[311,1483,335],{"emptyLinePlaceholder":334},[311,1485,1486,1489,1492,1495,1498,1501],{"class":313,"line":345},[311,1487,1488],{"class":317},"const",[311,1490,1491],{"class":948}," sdk",[311,1493,1494],{"class":317}," =",[311,1496,1497],{"class":317}," new",[311,1499,1500],{"class":727}," NodeSDK",[311,1502,1503],{"class":321},"({\n",[311,1505,1506,1509,1512,1515],{"class":313,"line":351},[311,1507,1508],{"class":321},"  instrumentations: [",[311,1510,1511],{"class":317},"new",[311,1513,1514],{"class":727}," OpenAIInstrumentation",[311,1516,1517],{"class":321},"()],\n",[311,1519,1520],{"class":313,"line":356},[311,1521,1522],{"class":321},"});\n",[311,1524,1525],{"class":313,"line":369},[311,1526,335],{"emptyLinePlaceholder":334},[311,1528,1529,1532,1535],{"class":313,"line":381},[311,1530,1531],{"class":321},"sdk.",[311,1533,1534],{"class":727},"start",[311,1536,1537],{"class":321},"();\n",[209,1539,1540,1541,1543],{},"The same ",[257,1542,1207],{}," attributes are captured on the Node side.",[1545,1546,1547],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":307,"searchDepth":345,"depth":331,"links":1549},[1550,1551,1552,1553,1554,1555,1556,1557,1558],{"id":221,"depth":331,"text":222},{"id":484,"depth":331,"text":485},{"id":633,"depth":331,"text":634},{"id":838,"depth":331,"text":839},{"id":865,"depth":331,"text":866},{"id":989,"depth":331,"text":990},{"id":1215,"depth":331,"text":1216},{"id":1339,"depth":331,"text":1340},{"id":1435,"depth":331,"text":1436},"2026-04-07T00:00:00.000Z","Instrument the OpenAI Python SDK with OpenTelemetry. Auto-capture gen_ai spans, token usage, model parameters, and errors with opentelemetry-instrumentation-openai.","md","\u002Fguides\u002Fopentelemetry-openai\u002Fcover.webp",{"keyword_difficulty":1564,"readingTime":1565},"easy",{"text":1566,"minutes":1567,"time":1568,"words":1569},"4 min read",3.5,210000,700,{"title":129,"description":1560},"FADV2NGDSdx7IbvSWLjcdQFryuEBgJJ9i2WiEz3P5ko",[1573,1575],{"title":125,"path":126,"stem":127,"description":1574,"children":-1},"Learn how to instrument Node.js AWS Lambda functions with OpenTelemetry to gain visibility into serverless applications, track cold starts, and trace downstream dependencies.",{"title":133,"path":134,"stem":135,"description":1576,"children":-1},"Learn how to instrument Phoenix Framework with OpenTelemetry for distributed tracing, LiveView monitoring, and Ecto query tracing.",{"id":1578,"node_id":1579,"name":1580,"full_name":1581,"private":1582,"owner":1583,"html_url":1600,"description":1601,"fork":1582,"url":1602,"forks_url":1603,"keys_url":1604,"collaborators_url":1605,"teams_url":1606,"hooks_url":1607,"issue_events_url":1608,"events_url":1609,"assignees_url":1610,"branches_url":1611,"tags_url":1612,"blobs_url":1613,"git_tags_url":1614,"git_refs_url":1615,"trees_url":1616,"statuses_url":1617,"languages_url":1618,"stargazers_url":1619,"contributors_url":1620,"subscribers_url":1621,"subscription_url":1622,"commits_url":1623,"git_commits_url":1624,"comments_url":1625,"issue_comment_url":1626,"contents_url":1627,"compare_url":1628,"merges_url":1629,"archive_url":1630,"downloads_url":1631,"issues_url":1632,"pulls_url":1633,"milestones_url":1634,"notifications_url":1635,"labels_url":1636,"releases_url":1637,"deployments_url":1638,"created_at":1639,"updated_at":1640,"pushed_at":1641,"git_url":1642,"ssh_url":1643,"clone_url":1644,"svn_url":1600,"homepage":1645,"size":1646,"stargazers_count":1647,"watchers_count":1647,"language":1648,"has_issues":334,"has_projects":334,"has_downloads":334,"has_wiki":334,"has_pages":1582,"has_discussions":334,"forks_count":1649,"mirror_url":204,"archived":1582,"disabled":1582,"open_issues_count":1650,"license":1651,"allow_forking":334,"is_template":1582,"web_commit_signoff_required":1582,"has_pull_requests":334,"pull_request_creation_policy":1657,"topics":1658,"visibility":1599,"forks":1649,"open_issues":1650,"watchers":1647,"default_branch":1673,"temp_clone_token":204,"custom_properties":1674,"organization":1675,"network_count":1649,"subscribers_count":1676},440841550,"R_kgDOGka1Tg","uptrace","uptrace\u002Fuptrace",false,{"login":1580,"id":1584,"node_id":1585,"avatar_url":1586,"gravatar_id":307,"url":1587,"html_url":1588,"followers_url":1589,"following_url":1590,"gists_url":1591,"starred_url":1592,"subscriptions_url":1593,"organizations_url":1594,"repos_url":1595,"events_url":1596,"received_events_url":1597,"type":1598,"user_view_type":1599,"site_admin":1582},64948717,"MDEyOk9yZ2FuaXphdGlvbjY0OTQ4NzE3","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F64948717?v=4","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fuptrace","https:\u002F\u002Fgithub.com\u002Fuptrace","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fuptrace\u002Ffollowers","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fuptrace\u002Ffollowing{\u002Fother_user}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fuptrace\u002Fgists{\u002Fgist_id}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fuptrace\u002Fstarred{\u002Fowner}{\u002Frepo}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fuptrace\u002Fsubscriptions","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fuptrace\u002Forgs","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fuptrace\u002Frepos","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fuptrace\u002Fevents{\u002Fprivacy}","https:\u002F\u002Fapi.github.com\u002Fusers\u002Fuptrace\u002Freceived_events","Organization","public","https:\u002F\u002Fgithub.com\u002Fuptrace\u002Fuptrace","Open source APM: OpenTelemetry traces, metrics, and logs","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fforks","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fkeys{\u002Fkey_id}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fcollaborators{\u002Fcollaborator}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fteams","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fhooks","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fissues\u002Fevents{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fevents","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fassignees{\u002Fuser}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fbranches{\u002Fbranch}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Ftags","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fgit\u002Fblobs{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fgit\u002Ftags{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fgit\u002Frefs{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fgit\u002Ftrees{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fstatuses\u002F{sha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Flanguages","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fstargazers","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fcontributors","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fsubscribers","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fsubscription","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fcommits{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fgit\u002Fcommits{\u002Fsha}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fcomments{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fissues\u002Fcomments{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fcontents\u002F{+path}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fcompare\u002F{base}...{head}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fmerges","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002F{archive_format}{\u002Fref}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fdownloads","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fissues{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fpulls{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fmilestones{\u002Fnumber}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fnotifications{?since,all,participating}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Flabels{\u002Fname}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Freleases{\u002Fid}","https:\u002F\u002Fapi.github.com\u002Frepos\u002Fuptrace\u002Fuptrace\u002Fdeployments","2021-12-22T11:53:18Z","2026-04-08T09:57:56Z","2026-03-13T23:34:49Z","git:\u002F\u002Fgithub.com\u002Fuptrace\u002Fuptrace.git","git@github.com:uptrace\u002Fuptrace.git","https:\u002F\u002Fgithub.com\u002Fuptrace\u002Fuptrace.git","https:\u002F\u002Fuptrace.dev\u002Fget\u002Fhosted\u002Fopen-source-apm",5919,4163,"Go",202,37,{"key":1652,"name":1653,"spdx_id":1654,"url":1655,"node_id":1656},"agpl-3.0","GNU Affero General Public License v3.0","AGPL-3.0","https:\u002F\u002Fapi.github.com\u002Flicenses\u002Fagpl-3.0","MDc6TGljZW5zZTE=","all",[1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672],"apm","application-monitoring","clickhouse","distributed-tracing","golang","logs","metrics","monitoring","observability","opentelemetry","performance-monitoring","self-hosted","tracing","vue","master",{},{"login":1580,"id":1584,"node_id":1585,"avatar_url":1586,"gravatar_id":307,"url":1587,"html_url":1588,"followers_url":1589,"following_url":1590,"gists_url":1591,"starred_url":1592,"subscriptions_url":1593,"organizations_url":1594,"repos_url":1595,"events_url":1596,"received_events_url":1597,"type":1598,"user_view_type":1599,"site_admin":1582},29,1775654755554]