[{"data":1,"prerenderedAt":2285},["ShallowReactive",2],{"\u002Ffeatures\u002Ftraces\u002Fgrouping-navigation":3,"\u002Ffeatures\u002Ftraces\u002Fgrouping":116},[4,8,28,38,52,56,60,70,74,78,82,86,90,94,98],{"title":5,"path":6,"stem":7},"Get started","\u002Ffeatures","features\u002Findex",{"title":9,"closed":10,"path":11,"stem":12,"children":13,"page":-1},"Traces",true,"\u002Ffeatures\u002Ftraces","features\u002F01.traces\u002Findex",[14,16,20,24],{"title":15,"path":11,"stem":12},"Introduction",{"title":17,"path":18,"stem":19},"Grouping & systems","\u002Ffeatures\u002Ftraces\u002Fgrouping","features\u002F01.traces\u002Fgrouping",{"title":21,"path":22,"stem":23},"Querying spans","\u002Ffeatures\u002Ftraces\u002Fquerying-spans","features\u002F01.traces\u002Fquerying-spans",{"title":25,"path":26,"stem":27},"Querying traces","\u002Ffeatures\u002Ftraces\u002Fquerying-traces","features\u002F01.traces\u002Fquerying-traces",{"title":29,"closed":10,"path":30,"stem":31,"children":32,"page":-1},"Logs","\u002Ffeatures\u002Flogs","features\u002F02.logs\u002Findex",[33,34],{"title":15,"path":30,"stem":31},{"title":35,"path":36,"stem":37},"Grouping rules","\u002Ffeatures\u002Flogs\u002Fgrouping","features\u002F02.logs\u002Fgrouping",{"title":39,"closed":10,"path":40,"stem":41,"children":42,"page":-1},"Metrics","\u002Ffeatures\u002Fmetrics","features\u002F03.metrics\u002Findex",[43,44,48],{"title":15,"path":40,"stem":41},{"title":45,"path":46,"stem":47},"Querying","\u002Ffeatures\u002Fmetrics\u002Fquerying","features\u002F03.metrics\u002F02.querying",{"title":49,"path":50,"stem":51},"PromQL compat","\u002Ffeatures\u002Fmetrics\u002Fpromql-compat","features\u002F03.metrics\u002F03.promql-compat",{"title":53,"path":54,"stem":55},"Alerts and Notifications","\u002Ffeatures\u002Falerting","features\u002F04.alerting",{"title":57,"path":58,"stem":59},"Chart annotations","\u002Ffeatures\u002Fannotations","features\u002F05.annotations",{"title":61,"path":62,"stem":63,"children":64,"closed":10},"Dashboards","\u002Ffeatures\u002Fdashboards","features\u002F06.dashboards\u002F1.index",[65,66],{"title":61,"path":62,"stem":63},{"title":67,"path":68,"stem":69},"YAML Templates","\u002Ffeatures\u002Fdashboards\u002Fyaml","features\u002F06.dashboards\u002F2.yaml",{"title":71,"path":72,"stem":73},"Transformations","\u002Ffeatures\u002Ftransformations","features\u002F07.transformations",{"title":75,"path":76,"stem":77},"Service graph","\u002Ffeatures\u002Fservice-graph","features\u002F08.service-graph",{"title":79,"path":80,"stem":81},"Grafana integration","\u002Ffeatures\u002Fgrafana","features\u002F09.grafana",{"title":83,"path":84,"stem":85},"Data fixtures","\u002Ffeatures\u002Ffixtures","features\u002F10.fixtures",{"title":87,"path":88,"stem":89},"JavaScript Source Maps","\u002Ffeatures\u002Fsourcemaps","features\u002F11.sourcemaps",{"title":91,"path":92,"stem":93},"MCP Server","\u002Ffeatures\u002Fmcp","features\u002F12.mcp",{"title":95,"path":96,"stem":97},"Searching","\u002Ffeatures\u002Fsearching","features\u002F4.searching",{"title":99,"closed":10,"path":100,"stem":101,"children":102,"page":115},"SSO","\u002Ffeatures\u002Fsso","features\u002Fsso",[103,107,111],{"title":104,"path":105,"stem":106},"Google","\u002Ffeatures\u002Fsso\u002Fgoogle","features\u002Fsso\u002F1.google",{"title":108,"path":109,"stem":110},"Okta","\u002Ffeatures\u002Fsso\u002Fokta","features\u002Fsso\u002F2.okta",{"title":112,"path":113,"stem":114},"Keycloak","\u002Ffeatures\u002Fsso\u002Fkeycloak","features\u002Fsso\u002F3.keycloak",false,{"page":117,"surround":2280},{"id":118,"title":119,"body":120,"description":2268,"extension":2269,"image":2270,"meta":2271,"navigation":2277,"path":18,"seo":2278,"stem":19,"surround_disabled":115,"__hash__":2279},"features\u002Ffeatures\u002F01.traces\u002Fgrouping.md","Grouping similar spans and events together",{"type":121,"value":122,"toc":2251},"minimark",[123,127,132,135,196,199,338,348,352,355,362,405,411,461,465,475,485,488,543,549,553,560,602,606,609,646,650,657,680,690,693,701,704,752,755,799,802,810,813,859,862,870,873,925,928,963,967,975,978,1025,1028,1070,1074,1082,1085,1142,1146,1154,1157,1194,1197,1247,1250,1294,1297,1309,1311,1352,1704,1710,1743,1746,1757,1759,1815,2198,2204,2239,2247],[124,125,126],"p",{},"Uptrace automatically groups similar spans and events together to help you identify patterns and anomalies in your application. This page explains how grouping works, how to optimize span names for effective grouping, and how to use OpenTelemetry semantic conventions for different types of operations.",[128,129,131],"h2",{"id":130},"how-grouping-works","How grouping works",[124,133,134],{},"Uptrace computes a hash for each span based on its type and key attributes. Spans with the same hash are grouped together. The hash always includes:",[136,137,138,146,164,174],"ul",{},[139,140,141,145],"li",{},[142,143,144],"strong",{},"Project ID"," - spans from different projects are never grouped together",[139,147,148,151,152,156,157,156,160,163],{},[142,149,150],{},"System"," - the detected span type (e.g., ",[153,154,155],"code",{},"http",", ",[153,158,159],{},"db:postgresql",[153,161,162],{},"messaging:rabbitmq",")",[139,165,166,169,170,173],{},[142,167,168],{},"Span name"," (for spans) or ",[142,171,172],{},"Event name"," (for events)",[139,175,176,179,180,156,183,156,186,156,189,192,193],{},[142,177,178],{},"Span kind"," (for spans) - ",[153,181,182],{},"client",[153,184,185],{},"server",[153,187,188],{},"producer",[153,190,191],{},"consumer",", or ",[153,194,195],{},"internal",[124,197,198],{},"Additionally, each span type includes type-specific attributes in the hash:",[200,201,202,215],"table",{},[203,204,205],"thead",{},[206,207,208,212],"tr",{},[209,210,211],"th",{},"Span Type",[209,213,214],{},"Grouping Attributes",[216,217,218,232,257,273,292,308,329],"tbody",{},[206,219,220,224],{},[221,222,223],"td",{},"HTTP",[221,225,226,156,229],{},[153,227,228],{},"http.request.method",[153,230,231],{},"http.route",[206,233,234,237],{},[221,235,236],{},"Database",[221,238,239,156,242,156,245,156,248,156,251,156,254],{},[153,240,241],{},"db.system.name",[153,243,244],{},"db.namespace",[153,246,247],{},"db.collection.name",[153,249,250],{},"db.operation.name",[153,252,253],{},"db.query.summary",[153,255,256],{},"db.stored_procedure.name",[206,258,259,262],{},[221,260,261],{},"RPC",[221,263,264,156,267,156,270],{},[153,265,266],{},"rpc.system",[153,268,269],{},"rpc.service",[153,271,272],{},"rpc.method",[206,274,275,278],{},[221,276,277],{},"Messaging",[221,279,280,156,283,156,286,156,289],{},[153,281,282],{},"messaging.system",[153,284,285],{},"messaging.operation.name",[153,287,288],{},"messaging.operation.type",[153,290,291],{},"messaging.destination.name",[206,293,294,297],{},[221,295,296],{},"FaaS",[221,298,299,156,302,156,305],{},[153,300,301],{},"faas.name",[153,303,304],{},"faas.document.collection",[153,306,307],{},"faas.document.operation",[206,309,310,312],{},[221,311,29],{},[221,313,314,156,317,156,320,156,323,156,326],{},[153,315,316],{},"log.severity",[153,318,319],{},"log.message_format",[153,321,322],{},"exception.type",[153,324,325],{},"error.type",[153,327,328],{},"telemetry.sdk.language",[206,330,331,334],{},[221,332,333],{},"Exceptions",[221,335,336],{},[153,337,322],{},[124,339,340,341,343,344,347],{},"Uptrace supports both stable and legacy OpenTelemetry semantic convention attribute names. For example, both ",[153,342,241],{}," (stable) and ",[153,345,346],{},"db.system"," (legacy) are recognized.",[128,349,351],{"id":350},"span-names","Span names",[124,353,354],{},"Uptrace uses span names and some attributes to group similar spans together. To group spans properly, give them short and concise names. The total number of unique span names should be less than 1000. Otherwise, you will have too many span groups and your experience may suffer.",[124,356,357,358,361],{},"The following names are ",[142,359,360],{},"good"," because they are short, distinctive, and help grouping similar spans together:",[200,363,364,373],{},[203,365,366],{},[206,367,368,370],{},[209,369,168],{},[209,371,372],{},"Comment",[216,374,375,385,395],{},[206,376,377,382],{},[221,378,379],{},[153,380,381],{},"GET \u002Fprojects\u002F:id",[221,383,384],{},"Good. A route name with param names.",[206,386,387,392],{},[221,388,389],{},[153,390,391],{},"select_project",[221,393,394],{},"Good. A function name without arguments.",[206,396,397,402],{},[221,398,399],{},[153,400,401],{},"SELECT * FROM projects WHERE id = ?",[221,403,404],{},"Good. A database query with placeholders.",[124,406,357,407,410],{},[142,408,409],{},"bad"," because they contain variable params and args:",[200,412,413,421],{},[203,414,415],{},[206,416,417,419],{},[209,418,168],{},[209,420,372],{},[216,422,423,437,449],{},[206,424,425,430],{},[221,426,427],{},[153,428,429],{},"GET \u002Fprojects\u002F42",[221,431,432,433,436],{},"Bad. Contains a variable param ",[153,434,435],{},"42",".",[206,438,439,444],{},[221,440,441],{},[153,442,443],{},"select_project(42)",[221,445,446,447,436],{},"Bad. Contains a variable ",[153,448,435],{},[206,450,451,456],{},[221,452,453],{},[153,454,455],{},"SELECT * FROM projects WHERE id = 42",[221,457,458,459,436],{},"Bad. Contains a variable arg ",[153,460,435],{},[128,462,464],{"id":463},"display-name","Display name",[124,466,467,468,471,472,436],{},"Because OpenTelemetry uses span and event names to group similar spans together, such names end up being not very descriptive, for example, SQL spans often have names like ",[153,469,470],{},"SELECT"," or ",[153,473,474],{},"INSERT",[124,476,477,478,481,482,484],{},"This is where the ",[153,479,480],{},"display.name"," attribute comes in handy. The ",[153,483,480],{}," is a human-readable string that provides a short summary of the operation that the span or event represents.",[124,486,487],{},"Uptrace doesn't use display names for grouping so they don't have the same limitations as span names. For example, a span representing a SQL query might have the following name and attributes:",[489,490,495],"pre",{"className":491,"code":492,"language":493,"meta":494,"style":494},"language-toml shiki shiki-themes github-light","SpanName = \"SELECT\"\n\ndisplay.name = \"pg_select_items_from_group(123)\"\ndb.system.name = \"postgresql\"\ndb.query.text = \"SELECT * FROM items WHERE group_id = 123 ORDER BY id LIMIT 100\"\n","toml","",[153,496,497,510,516,525,534],{"__ignoreMap":494},[498,499,502,506],"span",{"class":500,"line":501},"line",1,[498,503,505],{"class":504},"sgsFI","SpanName = ",[498,507,509],{"class":508},"sYBdl","\"SELECT\"\n",[498,511,513],{"class":500,"line":512},2,[498,514,515],{"emptyLinePlaceholder":10},"\n",[498,517,519,522],{"class":500,"line":518},3,[498,520,521],{"class":504},"display.name = ",[498,523,524],{"class":508},"\"pg_select_items_from_group(123)\"\n",[498,526,528,531],{"class":500,"line":527},4,[498,529,530],{"class":504},"db.system.name = ",[498,532,533],{"class":508},"\"postgresql\"\n",[498,535,537,540],{"class":500,"line":536},5,[498,538,539],{"class":504},"db.query.text = ",[498,541,542],{"class":508},"\"SELECT * FROM items WHERE group_id = 123 ORDER BY id LIMIT 100\"\n",[124,544,545,546,548],{},"You can use ",[153,547,480],{}," attribute with events too.",[128,550,552],{"id":551},"custom-grouping","Custom grouping",[124,554,555,556,559],{},"You can customize how Uptrace groups spans and events together by specifying the ",[153,557,558],{},"grouping.fingerprint"," attribute which can be a string or a number (hash). Uptrace will group spans\u002Fevents with the same fingerprint together.",[489,561,563],{"className":491,"code":562,"language":493,"meta":494,"style":494},"SpanName = \"SELECT\"\n\ndisplay.name = \"pg_select_items_from_group(123)\"\ndb.system.name = \"postgresql\"\ndb.query.text = \"SELECT * FROM items WHERE group_id = 123 ORDER BY id LIMIT 100\"\ngrouping.fingerprint = \"select group items\"\n",[153,564,565,571,575,581,587,593],{"__ignoreMap":494},[498,566,567,569],{"class":500,"line":501},[498,568,505],{"class":504},[498,570,509],{"class":508},[498,572,573],{"class":500,"line":512},[498,574,515],{"emptyLinePlaceholder":10},[498,576,577,579],{"class":500,"line":518},[498,578,521],{"class":504},[498,580,524],{"class":508},[498,582,583,585],{"class":500,"line":527},[498,584,530],{"class":504},[498,586,533],{"class":508},[498,588,589,591],{"class":500,"line":536},[498,590,539],{"class":504},[498,592,542],{"class":508},[498,594,596,599],{"class":500,"line":595},6,[498,597,598],{"class":504},"grouping.fingerprint = ",[498,600,601],{"class":508},"\"select group items\"\n",[128,603,605],{"id":604},"grouping-settings","Grouping settings",[124,607,608],{},"On the Project Settings page, there are several options that control how Uptrace groups spans together:",[136,610,611,625],{},[139,612,613,616,617,620,621,624],{},[142,614,615],{},"Group by environment"," - Group spans with different ",[153,618,619],{},"deployment.environment.name"," (or legacy ",[153,622,623],{},"deployment.environment",") attribute separately. After enabling this setting, there will be separate groups for spans with the same name but different environments.",[139,626,627,630,631,634,635,638,639,642,643,436],{},[142,628,629],{},"Group functions by service"," - Group spans with ",[153,632,633],{},"funcs"," system and different ",[153,636,637],{},"service.name"," attribute separately. After enabling this setting, there will be a separate system for each service such as ",[153,640,641],{},"funcs:service1"," and ",[153,644,645],{},"funcs:service2",[128,647,649],{"id":648},"span-systems","Span systems",[124,651,652,653,656],{},"Depending on the presence of some semantic attributes, Uptrace assigns each span a ",[142,654,655],{},"system",", for example:",[136,658,659,665,670],{},[139,660,661,664],{},[153,662,663],{},"http:service_name"," system for HTTP spans.",[139,666,667,669],{},[153,668,159],{}," for PostgreSQL queries.",[139,671,672,675,676,679],{},[153,673,674],{},"log:error"," for log messages with ",[153,677,678],{},"ERROR"," severity.",[124,681,682,683,436],{},"Using a system, you can easily filter spans that have the same set of attributes, for example, ",[684,685,689],"a",{"href":686,"rel":687},"https:\u002F\u002Fapp.uptrace.dev\u002Fexplore\u002F1\u002Fgroups?system=db:all",[688],"nofollow","all database spans",[691,692,223],"h3",{"id":155},[124,694,695,696,436],{},"To monitor HTTP clients and servers, use the ",[684,697,700],{"href":698,"rel":699},"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions\u002Fblob\u002Fmain\u002Fdocs\u002Fhttp\u002Fhttp-spans.md",[688],"HTTP semantic conventions",[124,702,703],{},"A minimal HTTP server example:",[489,705,707],{"className":491,"code":706,"language":493,"meta":494,"style":494},"SpanName = \"GET \u002Fusers\u002F:id\"\nSpanKind = \"server\"\n\nhttp.request.method = \"GET\"\nhttp.route = \"\u002Fusers\u002F:id\"\nurl.scheme = \"https\"\n",[153,708,709,716,724,728,736,744],{"__ignoreMap":494},[498,710,711,713],{"class":500,"line":501},[498,712,505],{"class":504},[498,714,715],{"class":508},"\"GET \u002Fusers\u002F:id\"\n",[498,717,718,721],{"class":500,"line":512},[498,719,720],{"class":504},"SpanKind = ",[498,722,723],{"class":508},"\"server\"\n",[498,725,726],{"class":500,"line":518},[498,727,515],{"emptyLinePlaceholder":10},[498,729,730,733],{"class":500,"line":527},[498,731,732],{"class":504},"http.request.method = ",[498,734,735],{"class":508},"\"GET\"\n",[498,737,738,741],{"class":500,"line":536},[498,739,740],{"class":504},"http.route = ",[498,742,743],{"class":508},"\"\u002Fusers\u002F:id\"\n",[498,745,746,749],{"class":500,"line":595},[498,747,748],{"class":504},"url.scheme = ",[498,750,751],{"class":508},"\"https\"\n",[124,753,754],{},"A minimal HTTP client example:",[489,756,758],{"className":491,"code":757,"language":493,"meta":494,"style":494},"SpanName = \"GET\"\nSpanKind = \"client\"\n\nhttp.request.method = \"GET\"\nurl.full = \"https:\u002F\u002Fapi.example.com\u002Fusers\u002F123\"\nserver.address = \"api.example.com\"\n",[153,759,760,766,773,777,783,791],{"__ignoreMap":494},[498,761,762,764],{"class":500,"line":501},[498,763,505],{"class":504},[498,765,735],{"class":508},[498,767,768,770],{"class":500,"line":512},[498,769,720],{"class":504},[498,771,772],{"class":508},"\"client\"\n",[498,774,775],{"class":500,"line":518},[498,776,515],{"emptyLinePlaceholder":10},[498,778,779,781],{"class":500,"line":527},[498,780,732],{"class":504},[498,782,735],{"class":508},[498,784,785,788],{"class":500,"line":536},[498,786,787],{"class":504},"url.full = ",[498,789,790],{"class":508},"\"https:\u002F\u002Fapi.example.com\u002Fusers\u002F123\"\n",[498,792,793,796],{"class":500,"line":595},[498,794,795],{"class":504},"server.address = ",[498,797,798],{"class":508},"\"api.example.com\"\n",[691,800,261],{"id":801},"rpc",[124,803,804,805,436],{},"To monitor remote procedure calls, use the ",[684,806,809],{"href":807,"rel":808},"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions\u002Fblob\u002Fmain\u002Fdocs\u002Frpc\u002Frpc-spans.md",[688],"RPC semantic conventions",[124,811,812],{},"A minimal RPC server example:",[489,814,816],{"className":491,"code":815,"language":493,"meta":494,"style":494},"SpanName = \"AuthService\u002FAuth\"\nSpanKind = \"server\"\n\nrpc.system = \"grpc\"\nrpc.service = \"AuthService\"\nrpc.method = \"Auth\"\n",[153,817,818,825,831,835,843,851],{"__ignoreMap":494},[498,819,820,822],{"class":500,"line":501},[498,821,505],{"class":504},[498,823,824],{"class":508},"\"AuthService\u002FAuth\"\n",[498,826,827,829],{"class":500,"line":512},[498,828,720],{"class":504},[498,830,723],{"class":508},[498,832,833],{"class":500,"line":518},[498,834,515],{"emptyLinePlaceholder":10},[498,836,837,840],{"class":500,"line":527},[498,838,839],{"class":504},"rpc.system = ",[498,841,842],{"class":508},"\"grpc\"\n",[498,844,845,848],{"class":500,"line":536},[498,846,847],{"class":504},"rpc.service = ",[498,849,850],{"class":508},"\"AuthService\"\n",[498,852,853,856],{"class":500,"line":595},[498,854,855],{"class":504},"rpc.method = ",[498,857,858],{"class":508},"\"Auth\"\n",[691,860,236],{"id":861},"database",[124,863,864,865,436],{},"To monitor database queries and Redis\u002Fmemcached commands, use the ",[684,866,869],{"href":867,"rel":868},"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions\u002Fblob\u002Fmain\u002Fdocs\u002Fdb\u002Fdatabase-spans.md",[688],"database semantic conventions",[124,871,872],{},"A minimal DB example:",[489,874,876],{"className":491,"code":875,"language":493,"meta":494,"style":494},"SpanName = \"SELECT users\"\nSpanKind = \"client\"\n\ndb.system.name = \"postgresql\"\ndb.query.text = \"SELECT * FROM users WHERE id = $1\"\ndb.collection.name = \"users\"\ndb.namespace = \"mydb\"\n",[153,877,878,885,891,895,901,908,916],{"__ignoreMap":494},[498,879,880,882],{"class":500,"line":501},[498,881,505],{"class":504},[498,883,884],{"class":508},"\"SELECT users\"\n",[498,886,887,889],{"class":500,"line":512},[498,888,720],{"class":504},[498,890,772],{"class":508},[498,892,893],{"class":500,"line":518},[498,894,515],{"emptyLinePlaceholder":10},[498,896,897,899],{"class":500,"line":527},[498,898,530],{"class":504},[498,900,533],{"class":508},[498,902,903,905],{"class":500,"line":536},[498,904,539],{"class":504},[498,906,907],{"class":508},"\"SELECT * FROM users WHERE id = $1\"\n",[498,909,910,913],{"class":500,"line":595},[498,911,912],{"class":504},"db.collection.name = ",[498,914,915],{"class":508},"\"users\"\n",[498,917,919,922],{"class":500,"line":918},7,[498,920,921],{"class":504},"db.namespace = ",[498,923,924],{"class":508},"\"mydb\"\n",[124,926,927],{},"A minimal Redis command example:",[489,929,931],{"className":491,"code":930,"language":493,"meta":494,"style":494},"SpanName = \"GET\"\nSpanKind = \"client\"\n\ndb.system.name = \"redis\"\ndb.query.text = \"GET foo\"\n",[153,932,933,939,945,949,956],{"__ignoreMap":494},[498,934,935,937],{"class":500,"line":501},[498,936,505],{"class":504},[498,938,735],{"class":508},[498,940,941,943],{"class":500,"line":512},[498,942,720],{"class":504},[498,944,772],{"class":508},[498,946,947],{"class":500,"line":518},[498,948,515],{"emptyLinePlaceholder":10},[498,950,951,953],{"class":500,"line":527},[498,952,530],{"class":504},[498,954,955],{"class":508},"\"redis\"\n",[498,957,958,960],{"class":500,"line":536},[498,959,539],{"class":504},[498,961,962],{"class":508},"\"GET foo\"\n",[691,964,966],{"id":965},"messages","Messages",[124,968,969,970,436],{},"To monitor producers and consumers (queues), use the ",[684,971,974],{"href":972,"rel":973},"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions\u002Fblob\u002Fmain\u002Fdocs\u002Fmessaging\u002Fmessaging-spans.md",[688],"messaging semantic conventions",[124,976,977],{},"A minimal producer example:",[489,979,981],{"className":491,"code":980,"language":493,"meta":494,"style":494},"SpanName = \"MyQueue send\"\nSpanKind = \"producer\"\n\nmessaging.system = \"rabbitmq\"\nmessaging.destination.name = \"MyQueue\"\nmessaging.operation.type = \"send\"\n",[153,982,983,990,997,1001,1009,1017],{"__ignoreMap":494},[498,984,985,987],{"class":500,"line":501},[498,986,505],{"class":504},[498,988,989],{"class":508},"\"MyQueue send\"\n",[498,991,992,994],{"class":500,"line":512},[498,993,720],{"class":504},[498,995,996],{"class":508},"\"producer\"\n",[498,998,999],{"class":500,"line":518},[498,1000,515],{"emptyLinePlaceholder":10},[498,1002,1003,1006],{"class":500,"line":527},[498,1004,1005],{"class":504},"messaging.system = ",[498,1007,1008],{"class":508},"\"rabbitmq\"\n",[498,1010,1011,1014],{"class":500,"line":536},[498,1012,1013],{"class":504},"messaging.destination.name = ",[498,1015,1016],{"class":508},"\"MyQueue\"\n",[498,1018,1019,1022],{"class":500,"line":595},[498,1020,1021],{"class":504},"messaging.operation.type = ",[498,1023,1024],{"class":508},"\"send\"\n",[124,1026,1027],{},"A minimal consumer example:",[489,1029,1031],{"className":491,"code":1030,"language":493,"meta":494,"style":494},"SpanName = \"MyQueue process\"\nSpanKind = \"consumer\"\n\nmessaging.system = \"rabbitmq\"\nmessaging.destination.name = \"MyQueue\"\nmessaging.operation.type = \"process\"\n",[153,1032,1033,1040,1047,1051,1057,1063],{"__ignoreMap":494},[498,1034,1035,1037],{"class":500,"line":501},[498,1036,505],{"class":504},[498,1038,1039],{"class":508},"\"MyQueue process\"\n",[498,1041,1042,1044],{"class":500,"line":512},[498,1043,720],{"class":504},[498,1045,1046],{"class":508},"\"consumer\"\n",[498,1048,1049],{"class":500,"line":518},[498,1050,515],{"emptyLinePlaceholder":10},[498,1052,1053,1055],{"class":500,"line":527},[498,1054,1005],{"class":504},[498,1056,1008],{"class":508},[498,1058,1059,1061],{"class":500,"line":536},[498,1060,1013],{"class":504},[498,1062,1016],{"class":508},[498,1064,1065,1067],{"class":500,"line":595},[498,1066,1021],{"class":504},[498,1068,1069],{"class":508},"\"process\"\n",[691,1071,1073],{"id":1072},"functions","Functions",[124,1075,1076,1077,436],{},"To monitor functions, use ",[684,1078,1081],{"href":1079,"rel":1080},"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions\u002Fblob\u002Fmain\u002Fdocs\u002Fgeneral\u002Fattributes.md#source-code-attributes",[688],"source code attributes",[124,1083,1084],{},"A minimal example:",[489,1086,1088],{"className":491,"code":1087,"language":493,"meta":494,"style":494},"SpanName = \"org.FetchUser\"\n\nservice.name = \"myservice\"\ncode.function.name = \"FetchUser\"\ncode.namespace = \"org\"\ncode.filepath = \"org\u002Fuser.go\"\ncode.lineno = 123\n",[153,1089,1090,1097,1101,1109,1117,1125,1133],{"__ignoreMap":494},[498,1091,1092,1094],{"class":500,"line":501},[498,1093,505],{"class":504},[498,1095,1096],{"class":508},"\"org.FetchUser\"\n",[498,1098,1099],{"class":500,"line":512},[498,1100,515],{"emptyLinePlaceholder":10},[498,1102,1103,1106],{"class":500,"line":518},[498,1104,1105],{"class":504},"service.name = ",[498,1107,1108],{"class":508},"\"myservice\"\n",[498,1110,1111,1114],{"class":500,"line":527},[498,1112,1113],{"class":504},"code.function.name = ",[498,1115,1116],{"class":508},"\"FetchUser\"\n",[498,1118,1119,1122],{"class":500,"line":536},[498,1120,1121],{"class":504},"code.namespace = ",[498,1123,1124],{"class":508},"\"org\"\n",[498,1126,1127,1130],{"class":500,"line":595},[498,1128,1129],{"class":504},"code.filepath = ",[498,1131,1132],{"class":508},"\"org\u002Fuser.go\"\n",[498,1134,1135,1138],{"class":500,"line":918},[498,1136,1137],{"class":504},"code.lineno = ",[498,1139,1141],{"class":1140},"sYu0t","123\n",[691,1143,1145],{"id":1144},"functions-as-a-service","Functions as a Service",[124,1147,1148,1149,436],{},"To monitor serverless functions, use the ",[684,1150,1153],{"href":1151,"rel":1152},"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions\u002Fblob\u002Fmain\u002Fdocs\u002Ffaas\u002Ffaas-spans.md",[688],"FaaS semantic conventions",[124,1155,1156],{},"A minimal HTTP-triggered function:",[489,1158,1160],{"className":491,"code":1159,"language":493,"meta":494,"style":494},"SpanName = \"my-lambda-function\"\nSpanKind = \"server\"\n\nfaas.trigger = \"http\"\nfaas.name = \"my-lambda-function\"\n",[153,1161,1162,1169,1175,1179,1187],{"__ignoreMap":494},[498,1163,1164,1166],{"class":500,"line":501},[498,1165,505],{"class":504},[498,1167,1168],{"class":508},"\"my-lambda-function\"\n",[498,1170,1171,1173],{"class":500,"line":512},[498,1172,720],{"class":504},[498,1174,723],{"class":508},[498,1176,1177],{"class":500,"line":518},[498,1178,515],{"emptyLinePlaceholder":10},[498,1180,1181,1184],{"class":500,"line":527},[498,1182,1183],{"class":504},"faas.trigger = ",[498,1185,1186],{"class":508},"\"http\"\n",[498,1188,1189,1192],{"class":500,"line":536},[498,1190,1191],{"class":504},"faas.name = ",[498,1193,1168],{"class":508},[124,1195,1196],{},"A datasource-triggered function (e.g., S3, DynamoDB):",[489,1198,1200],{"className":491,"code":1199,"language":493,"meta":494,"style":494},"SpanName = \"my-lambda-function\"\nSpanKind = \"server\"\n\nfaas.trigger = \"datasource\"\nfaas.name = \"my-lambda-function\"\nfaas.document.collection = \"my-bucket\"\nfaas.document.operation = \"insert\"\n",[153,1201,1202,1208,1214,1218,1225,1231,1239],{"__ignoreMap":494},[498,1203,1204,1206],{"class":500,"line":501},[498,1205,505],{"class":504},[498,1207,1168],{"class":508},[498,1209,1210,1212],{"class":500,"line":512},[498,1211,720],{"class":504},[498,1213,723],{"class":508},[498,1215,1216],{"class":500,"line":518},[498,1217,515],{"emptyLinePlaceholder":10},[498,1219,1220,1222],{"class":500,"line":527},[498,1221,1183],{"class":504},[498,1223,1224],{"class":508},"\"datasource\"\n",[498,1226,1227,1229],{"class":500,"line":536},[498,1228,1191],{"class":504},[498,1230,1168],{"class":508},[498,1232,1233,1236],{"class":500,"line":595},[498,1234,1235],{"class":504},"faas.document.collection = ",[498,1237,1238],{"class":508},"\"my-bucket\"\n",[498,1240,1241,1244],{"class":500,"line":918},[498,1242,1243],{"class":504},"faas.document.operation = ",[498,1245,1246],{"class":508},"\"insert\"\n",[124,1248,1249],{},"A minimal client example (invoking a function):",[489,1251,1253],{"className":491,"code":1252,"language":493,"meta":494,"style":494},"SpanName = \"my-lambda-function\"\nSpanKind = \"client\"\n\nfaas.invoked_name = \"my-lambda-function\"\nfaas.invoked_provider = \"aws\"\nfaas.invoked_region = \"us-west-2\"\n",[153,1254,1255,1261,1267,1271,1278,1286],{"__ignoreMap":494},[498,1256,1257,1259],{"class":500,"line":501},[498,1258,505],{"class":504},[498,1260,1168],{"class":508},[498,1262,1263,1265],{"class":500,"line":512},[498,1264,720],{"class":504},[498,1266,772],{"class":508},[498,1268,1269],{"class":500,"line":518},[498,1270,515],{"emptyLinePlaceholder":10},[498,1272,1273,1276],{"class":500,"line":527},[498,1274,1275],{"class":504},"faas.invoked_name = ",[498,1277,1168],{"class":508},[498,1279,1280,1283],{"class":500,"line":536},[498,1281,1282],{"class":504},"faas.invoked_provider = ",[498,1284,1285],{"class":508},"\"aws\"\n",[498,1287,1288,1291],{"class":500,"line":595},[498,1289,1290],{"class":504},"faas.invoked_region = ",[498,1292,1293],{"class":508},"\"us-west-2\"\n",[691,1295,333],{"id":1296},"exceptions",[124,1298,1299,1300,642,1305,1308],{},"To monitor errors and exceptions, use the ",[684,1301,1304],{"href":1302,"rel":1303},"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fsemantic-conventions\u002Fblob\u002Fmain\u002Fdocs\u002Fexceptions\u002Fexceptions-logs.md",[688],"exceptions semantic conventions",[142,1306,1307],{},"events"," API.",[124,1310,1084],{},[489,1312,1314],{"className":491,"code":1313,"language":493,"meta":494,"style":494},"EventName = \"exception\"\n\nexception.type = \"*exec.ExitError\"\nexception.message = \"exit status 1\"\nexception.stacktrace = \"\u003Cexception stacktrace>\"\n",[153,1315,1316,1324,1328,1336,1344],{"__ignoreMap":494},[498,1317,1318,1321],{"class":500,"line":501},[498,1319,1320],{"class":504},"EventName = ",[498,1322,1323],{"class":508},"\"exception\"\n",[498,1325,1326],{"class":500,"line":512},[498,1327,515],{"emptyLinePlaceholder":10},[498,1329,1330,1333],{"class":500,"line":518},[498,1331,1332],{"class":504},"exception.type = ",[498,1334,1335],{"class":508},"\"*exec.ExitError\"\n",[498,1337,1338,1341],{"class":500,"line":527},[498,1339,1340],{"class":504},"exception.message = ",[498,1342,1343],{"class":508},"\"exit status 1\"\n",[498,1345,1346,1349],{"class":500,"line":536},[498,1347,1348],{"class":504},"exception.stacktrace = ",[498,1350,1351],{"class":508},"\"\u003Cexception stacktrace>\"\n",[1353,1354,1355,1535,1623],"code-group",{},[489,1356,1361],{"className":1357,"code":1358,"filename":1359,"language":1360,"meta":494,"style":494},"language-go shiki shiki-themes github-light","span := trace.SpanFromContext(ctx)\n\nspan.RecordError(err, trace.WithAttributes(\n    attribute.String(\"exception.type\", fmt.Sprintf(\"%T\", err)),\n))\n\u002F\u002F Or manually:\nspan.AddEvent(\"exception\", trace.WithAttributes(\n    attribute.String(\"exception.type\", \"*exec.ExitError\"),\n    attribute.String(\"exception.message\", \"exit status 1\"),\n    attribute.String(\"exception.stacktrace\", string(debug.Stack())),\n))\n","Go","go",[153,1362,1363,1382,1386,1403,1436,1441,1447,1466,1485,1504,1530],{"__ignoreMap":494},[498,1364,1365,1368,1372,1375,1379],{"class":500,"line":501},[498,1366,1367],{"class":504},"span ",[498,1369,1371],{"class":1370},"sD7c4",":=",[498,1373,1374],{"class":504}," trace.",[498,1376,1378],{"class":1377},"s7eDp","SpanFromContext",[498,1380,1381],{"class":504},"(ctx)\n",[498,1383,1384],{"class":500,"line":512},[498,1385,515],{"emptyLinePlaceholder":10},[498,1387,1388,1391,1394,1397,1400],{"class":500,"line":518},[498,1389,1390],{"class":504},"span.",[498,1392,1393],{"class":1377},"RecordError",[498,1395,1396],{"class":504},"(err, trace.",[498,1398,1399],{"class":1377},"WithAttributes",[498,1401,1402],{"class":504},"(\n",[498,1404,1405,1408,1411,1414,1417,1420,1423,1425,1428,1431,1433],{"class":500,"line":527},[498,1406,1407],{"class":504},"    attribute.",[498,1409,1410],{"class":1377},"String",[498,1412,1413],{"class":504},"(",[498,1415,1416],{"class":508},"\"exception.type\"",[498,1418,1419],{"class":504},", fmt.",[498,1421,1422],{"class":1377},"Sprintf",[498,1424,1413],{"class":504},[498,1426,1427],{"class":508},"\"",[498,1429,1430],{"class":1140},"%T",[498,1432,1427],{"class":508},[498,1434,1435],{"class":504},", err)),\n",[498,1437,1438],{"class":500,"line":536},[498,1439,1440],{"class":504},"))\n",[498,1442,1443],{"class":500,"line":595},[498,1444,1446],{"class":1445},"sAwPA","\u002F\u002F Or manually:\n",[498,1448,1449,1451,1454,1456,1459,1462,1464],{"class":500,"line":918},[498,1450,1390],{"class":504},[498,1452,1453],{"class":1377},"AddEvent",[498,1455,1413],{"class":504},[498,1457,1458],{"class":508},"\"exception\"",[498,1460,1461],{"class":504},", trace.",[498,1463,1399],{"class":1377},[498,1465,1402],{"class":504},[498,1467,1469,1471,1473,1475,1477,1479,1482],{"class":500,"line":1468},8,[498,1470,1407],{"class":504},[498,1472,1410],{"class":1377},[498,1474,1413],{"class":504},[498,1476,1416],{"class":508},[498,1478,156],{"class":504},[498,1480,1481],{"class":508},"\"*exec.ExitError\"",[498,1483,1484],{"class":504},"),\n",[498,1486,1488,1490,1492,1494,1497,1499,1502],{"class":500,"line":1487},9,[498,1489,1407],{"class":504},[498,1491,1410],{"class":1377},[498,1493,1413],{"class":504},[498,1495,1496],{"class":508},"\"exception.message\"",[498,1498,156],{"class":504},[498,1500,1501],{"class":508},"\"exit status 1\"",[498,1503,1484],{"class":504},[498,1505,1507,1509,1511,1513,1516,1518,1521,1524,1527],{"class":500,"line":1506},10,[498,1508,1407],{"class":504},[498,1510,1410],{"class":1377},[498,1512,1413],{"class":504},[498,1514,1515],{"class":508},"\"exception.stacktrace\"",[498,1517,156],{"class":504},[498,1519,1520],{"class":1370},"string",[498,1522,1523],{"class":504},"(debug.",[498,1525,1526],{"class":1377},"Stack",[498,1528,1529],{"class":504},"())),\n",[498,1531,1533],{"class":500,"line":1532},11,[498,1534,1440],{"class":504},[489,1536,1541],{"className":1537,"code":1538,"filename":1539,"language":1540,"meta":494,"style":494},"language-python shiki shiki-themes github-light","from opentelemetry import trace\n\nspan = trace.get_current_span()\ntry:\n    # your code\n    pass\nexcept Exception as e:\n    span.record_exception(e)\n    span.set_status(trace.Status(trace.StatusCode.ERROR, str(e)))\n","Python","python",[153,1542,1543,1557,1561,1571,1579,1584,1589,1603,1608],{"__ignoreMap":494},[498,1544,1545,1548,1551,1554],{"class":500,"line":501},[498,1546,1547],{"class":1370},"from",[498,1549,1550],{"class":504}," opentelemetry ",[498,1552,1553],{"class":1370},"import",[498,1555,1556],{"class":504}," trace\n",[498,1558,1559],{"class":500,"line":512},[498,1560,515],{"emptyLinePlaceholder":10},[498,1562,1563,1565,1568],{"class":500,"line":518},[498,1564,1367],{"class":504},[498,1566,1567],{"class":1370},"=",[498,1569,1570],{"class":504}," trace.get_current_span()\n",[498,1572,1573,1576],{"class":500,"line":527},[498,1574,1575],{"class":1370},"try",[498,1577,1578],{"class":504},":\n",[498,1580,1581],{"class":500,"line":536},[498,1582,1583],{"class":1445},"    # your code\n",[498,1585,1586],{"class":500,"line":595},[498,1587,1588],{"class":1370},"    pass\n",[498,1590,1591,1594,1597,1600],{"class":500,"line":918},[498,1592,1593],{"class":1370},"except",[498,1595,1596],{"class":1140}," Exception",[498,1598,1599],{"class":1370}," as",[498,1601,1602],{"class":504}," e:\n",[498,1604,1605],{"class":500,"line":1468},[498,1606,1607],{"class":504},"    span.record_exception(e)\n",[498,1609,1610,1613,1615,1617,1620],{"class":500,"line":1487},[498,1611,1612],{"class":504},"    span.set_status(trace.Status(trace.StatusCode.",[498,1614,678],{"class":1140},[498,1616,156],{"class":504},[498,1618,1619],{"class":1140},"str",[498,1621,1622],{"class":504},"(e)))\n",[489,1624,1629],{"className":1625,"code":1626,"filename":1627,"language":1628,"meta":494,"style":494},"language-js shiki shiki-themes github-light","const span = trace.getActiveSpan();\ntry {\n  \u002F\u002F your code\n} catch (error) {\n  span.recordException(error);\n  span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n}\n","JavaScript","js",[153,1630,1631,1650,1657,1662,1673,1684,1699],{"__ignoreMap":494},[498,1632,1633,1636,1639,1642,1644,1647],{"class":500,"line":501},[498,1634,1635],{"class":1370},"const",[498,1637,1638],{"class":1140}," span",[498,1640,1641],{"class":1370}," =",[498,1643,1374],{"class":504},[498,1645,1646],{"class":1377},"getActiveSpan",[498,1648,1649],{"class":504},"();\n",[498,1651,1652,1654],{"class":500,"line":512},[498,1653,1575],{"class":1370},[498,1655,1656],{"class":504}," {\n",[498,1658,1659],{"class":500,"line":518},[498,1660,1661],{"class":1445},"  \u002F\u002F your code\n",[498,1663,1664,1667,1670],{"class":500,"line":527},[498,1665,1666],{"class":504},"} ",[498,1668,1669],{"class":1370},"catch",[498,1671,1672],{"class":504}," (error) {\n",[498,1674,1675,1678,1681],{"class":500,"line":536},[498,1676,1677],{"class":504},"  span.",[498,1679,1680],{"class":1377},"recordException",[498,1682,1683],{"class":504},"(error);\n",[498,1685,1686,1688,1691,1694,1696],{"class":500,"line":595},[498,1687,1677],{"class":504},[498,1689,1690],{"class":1377},"setStatus",[498,1692,1693],{"class":504},"({ code: SpanStatusCode.",[498,1695,678],{"class":1140},[498,1697,1698],{"class":504},", message: error.message });\n",[498,1700,1701],{"class":500,"line":918},[498,1702,1703],{"class":504},"}\n",[124,1705,1706,1707,1709],{},"You can also control how Uptrace groups exceptions together by specifying the ",[153,1708,558],{}," attribute which can be a string or a number (hash). Uptrace will group exceptions with the same fingerprint together.",[489,1711,1713],{"className":491,"code":1712,"language":493,"meta":494,"style":494},"EventName = \"exception\"\n\nexception.type = \"*exec.ExitError\"\nexception.message = \"exit status 1\"\ngrouping.fingerprint = \"*exec.ExitError\"\n",[153,1714,1715,1721,1725,1731,1737],{"__ignoreMap":494},[498,1716,1717,1719],{"class":500,"line":501},[498,1718,1320],{"class":504},[498,1720,1323],{"class":508},[498,1722,1723],{"class":500,"line":512},[498,1724,515],{"emptyLinePlaceholder":10},[498,1726,1727,1729],{"class":500,"line":518},[498,1728,1332],{"class":504},[498,1730,1335],{"class":508},[498,1732,1733,1735],{"class":500,"line":527},[498,1734,1340],{"class":504},[498,1736,1343],{"class":508},[498,1738,1739,1741],{"class":500,"line":536},[498,1740,598],{"class":504},[498,1742,1335],{"class":508},[691,1744,29],{"id":1745},"logs",[124,1747,1748,1749,642,1751,1753,1754,1756],{},"Uptrace groups logs by ",[153,1750,316],{},[153,1752,319],{},". The ",[153,1755,319],{}," attribute should contain the log message template (with placeholders), not the actual message with interpolated values. This ensures logs with the same pattern are grouped together.",[124,1758,1084],{},[489,1760,1762],{"className":491,"code":1761,"language":493,"meta":494,"style":494},"EventName = \"log\"\n\nlog.severity = \"info\"\nlog.message = \"user 123 logged in from 192.168.1.1\"\nlog.message_format = \"user %d logged in from %s\"\nlog.params.user_id = \"123\"\nlog.params.ip = \"192.168.1.1\"\n",[153,1763,1764,1771,1775,1783,1791,1799,1807],{"__ignoreMap":494},[498,1765,1766,1768],{"class":500,"line":501},[498,1767,1320],{"class":504},[498,1769,1770],{"class":508},"\"log\"\n",[498,1772,1773],{"class":500,"line":512},[498,1774,515],{"emptyLinePlaceholder":10},[498,1776,1777,1780],{"class":500,"line":518},[498,1778,1779],{"class":504},"log.severity = ",[498,1781,1782],{"class":508},"\"info\"\n",[498,1784,1785,1788],{"class":500,"line":527},[498,1786,1787],{"class":504},"log.message = ",[498,1789,1790],{"class":508},"\"user 123 logged in from 192.168.1.1\"\n",[498,1792,1793,1796],{"class":500,"line":536},[498,1794,1795],{"class":504},"log.message_format = ",[498,1797,1798],{"class":508},"\"user %d logged in from %s\"\n",[498,1800,1801,1804],{"class":500,"line":595},[498,1802,1803],{"class":504},"log.params.user_id = ",[498,1805,1806],{"class":508},"\"123\"\n",[498,1808,1809,1812],{"class":500,"line":918},[498,1810,1811],{"class":504},"log.params.ip = ",[498,1813,1814],{"class":508},"\"192.168.1.1\"\n",[1353,1816,1817,1965,2097],{},[489,1818,1820],{"className":1357,"code":1819,"filename":1359,"language":1360,"meta":494,"style":494},"span := trace.SpanFromContext(ctx)\n\nspan.AddEvent(\"log\", trace.WithAttributes(\n    attribute.String(\"log.severity\", \"info\"),\n    attribute.String(\"log.message\", fmt.Sprintf(\"user %d logged in from %s\", userID, ip)),\n    attribute.String(\"log.message_format\", \"user %d logged in from %s\"),\n    attribute.Int(\"log.params.user_id\", userID),\n    attribute.String(\"log.params.ip\", ip),\n))\n",[153,1821,1822,1834,1838,1855,1873,1907,1932,1947,1961],{"__ignoreMap":494},[498,1823,1824,1826,1828,1830,1832],{"class":500,"line":501},[498,1825,1367],{"class":504},[498,1827,1371],{"class":1370},[498,1829,1374],{"class":504},[498,1831,1378],{"class":1377},[498,1833,1381],{"class":504},[498,1835,1836],{"class":500,"line":512},[498,1837,515],{"emptyLinePlaceholder":10},[498,1839,1840,1842,1844,1846,1849,1851,1853],{"class":500,"line":518},[498,1841,1390],{"class":504},[498,1843,1453],{"class":1377},[498,1845,1413],{"class":504},[498,1847,1848],{"class":508},"\"log\"",[498,1850,1461],{"class":504},[498,1852,1399],{"class":1377},[498,1854,1402],{"class":504},[498,1856,1857,1859,1861,1863,1866,1868,1871],{"class":500,"line":527},[498,1858,1407],{"class":504},[498,1860,1410],{"class":1377},[498,1862,1413],{"class":504},[498,1864,1865],{"class":508},"\"log.severity\"",[498,1867,156],{"class":504},[498,1869,1870],{"class":508},"\"info\"",[498,1872,1484],{"class":504},[498,1874,1875,1877,1879,1881,1884,1886,1888,1890,1893,1896,1899,1902,1904],{"class":500,"line":536},[498,1876,1407],{"class":504},[498,1878,1410],{"class":1377},[498,1880,1413],{"class":504},[498,1882,1883],{"class":508},"\"log.message\"",[498,1885,1419],{"class":504},[498,1887,1422],{"class":1377},[498,1889,1413],{"class":504},[498,1891,1892],{"class":508},"\"user ",[498,1894,1895],{"class":1140},"%d",[498,1897,1898],{"class":508}," logged in from ",[498,1900,1901],{"class":1140},"%s",[498,1903,1427],{"class":508},[498,1905,1906],{"class":504},", userID, ip)),\n",[498,1908,1909,1911,1913,1915,1918,1920,1922,1924,1926,1928,1930],{"class":500,"line":595},[498,1910,1407],{"class":504},[498,1912,1410],{"class":1377},[498,1914,1413],{"class":504},[498,1916,1917],{"class":508},"\"log.message_format\"",[498,1919,156],{"class":504},[498,1921,1892],{"class":508},[498,1923,1895],{"class":1140},[498,1925,1898],{"class":508},[498,1927,1901],{"class":1140},[498,1929,1427],{"class":508},[498,1931,1484],{"class":504},[498,1933,1934,1936,1939,1941,1944],{"class":500,"line":918},[498,1935,1407],{"class":504},[498,1937,1938],{"class":1377},"Int",[498,1940,1413],{"class":504},[498,1942,1943],{"class":508},"\"log.params.user_id\"",[498,1945,1946],{"class":504},", userID),\n",[498,1948,1949,1951,1953,1955,1958],{"class":500,"line":1468},[498,1950,1407],{"class":504},[498,1952,1410],{"class":1377},[498,1954,1413],{"class":504},[498,1956,1957],{"class":508},"\"log.params.ip\"",[498,1959,1960],{"class":504},", ip),\n",[498,1962,1963],{"class":500,"line":1487},[498,1964,1440],{"class":504},[489,1966,1968],{"className":1537,"code":1967,"filename":1539,"language":1540,"meta":494,"style":494},"from opentelemetry import trace\n\nspan = trace.get_current_span()\nspan.add_event(\"log\", attributes={\n    \"log.severity\": \"info\",\n    \"log.message\": f\"user {user_id} logged in from {ip}\",\n    \"log.message_format\": \"user %d logged in from %s\",\n    \"log.params.user_id\": user_id,\n    \"log.params.ip\": ip,\n})\n",[153,1969,1970,1980,1984,1992,2010,2023,2057,2076,2084,2092],{"__ignoreMap":494},[498,1971,1972,1974,1976,1978],{"class":500,"line":501},[498,1973,1547],{"class":1370},[498,1975,1550],{"class":504},[498,1977,1553],{"class":1370},[498,1979,1556],{"class":504},[498,1981,1982],{"class":500,"line":512},[498,1983,515],{"emptyLinePlaceholder":10},[498,1985,1986,1988,1990],{"class":500,"line":518},[498,1987,1367],{"class":504},[498,1989,1567],{"class":1370},[498,1991,1570],{"class":504},[498,1993,1994,1997,1999,2001,2005,2007],{"class":500,"line":527},[498,1995,1996],{"class":504},"span.add_event(",[498,1998,1848],{"class":508},[498,2000,156],{"class":504},[498,2002,2004],{"class":2003},"sqxcx","attributes",[498,2006,1567],{"class":1370},[498,2008,2009],{"class":504},"{\n",[498,2011,2012,2015,2018,2020],{"class":500,"line":536},[498,2013,2014],{"class":508},"    \"log.severity\"",[498,2016,2017],{"class":504},": ",[498,2019,1870],{"class":508},[498,2021,2022],{"class":504},",\n",[498,2024,2025,2028,2030,2033,2035,2038,2041,2044,2046,2048,2051,2053,2055],{"class":500,"line":595},[498,2026,2027],{"class":508},"    \"log.message\"",[498,2029,2017],{"class":504},[498,2031,2032],{"class":1370},"f",[498,2034,1892],{"class":508},[498,2036,2037],{"class":1140},"{",[498,2039,2040],{"class":504},"user_id",[498,2042,2043],{"class":1140},"}",[498,2045,1898],{"class":508},[498,2047,2037],{"class":1140},[498,2049,2050],{"class":504},"ip",[498,2052,2043],{"class":1140},[498,2054,1427],{"class":508},[498,2056,2022],{"class":504},[498,2058,2059,2062,2064,2066,2068,2070,2072,2074],{"class":500,"line":918},[498,2060,2061],{"class":508},"    \"log.message_format\"",[498,2063,2017],{"class":504},[498,2065,1892],{"class":508},[498,2067,1895],{"class":1140},[498,2069,1898],{"class":508},[498,2071,1901],{"class":1140},[498,2073,1427],{"class":508},[498,2075,2022],{"class":504},[498,2077,2078,2081],{"class":500,"line":1468},[498,2079,2080],{"class":508},"    \"log.params.user_id\"",[498,2082,2083],{"class":504},": user_id,\n",[498,2085,2086,2089],{"class":500,"line":1487},[498,2087,2088],{"class":508},"    \"log.params.ip\"",[498,2090,2091],{"class":504},": ip,\n",[498,2093,2094],{"class":500,"line":1506},[498,2095,2096],{"class":504},"})\n",[489,2098,2100],{"className":1625,"code":2099,"filename":1627,"language":1628,"meta":494,"style":494},"const span = trace.getActiveSpan();\nspan.addEvent('log', {\n  'log.severity': 'info',\n  'log.message': `user ${userId} logged in from ${ip}`,\n  'log.message_format': 'user %d logged in from %s',\n  'log.params.user_id': userId,\n  'log.params.ip': ip,\n});\n",[153,2101,2102,2116,2131,2143,2166,2178,2186,2193],{"__ignoreMap":494},[498,2103,2104,2106,2108,2110,2112,2114],{"class":500,"line":501},[498,2105,1635],{"class":1370},[498,2107,1638],{"class":1140},[498,2109,1641],{"class":1370},[498,2111,1374],{"class":504},[498,2113,1646],{"class":1377},[498,2115,1649],{"class":504},[498,2117,2118,2120,2123,2125,2128],{"class":500,"line":512},[498,2119,1390],{"class":504},[498,2121,2122],{"class":1377},"addEvent",[498,2124,1413],{"class":504},[498,2126,2127],{"class":508},"'log'",[498,2129,2130],{"class":504},", {\n",[498,2132,2133,2136,2138,2141],{"class":500,"line":518},[498,2134,2135],{"class":508},"  'log.severity'",[498,2137,2017],{"class":504},[498,2139,2140],{"class":508},"'info'",[498,2142,2022],{"class":504},[498,2144,2145,2148,2150,2153,2156,2159,2161,2164],{"class":500,"line":527},[498,2146,2147],{"class":508},"  'log.message'",[498,2149,2017],{"class":504},[498,2151,2152],{"class":508},"`user ${",[498,2154,2155],{"class":504},"userId",[498,2157,2158],{"class":508},"} logged in from ${",[498,2160,2050],{"class":504},[498,2162,2163],{"class":508},"}`",[498,2165,2022],{"class":504},[498,2167,2168,2171,2173,2176],{"class":500,"line":536},[498,2169,2170],{"class":508},"  'log.message_format'",[498,2172,2017],{"class":504},[498,2174,2175],{"class":508},"'user %d logged in from %s'",[498,2177,2022],{"class":504},[498,2179,2180,2183],{"class":500,"line":595},[498,2181,2182],{"class":508},"  'log.params.user_id'",[498,2184,2185],{"class":504},": userId,\n",[498,2187,2188,2191],{"class":500,"line":918},[498,2189,2190],{"class":508},"  'log.params.ip'",[498,2192,2091],{"class":504},[498,2194,2195],{"class":500,"line":1468},[498,2196,2197],{"class":504},"});\n",[124,2199,2200,2201,2203],{},"You can also control how Uptrace groups logs together by providing ",[153,2202,558],{}," attribute which can be a string or a number (hash). This is useful for unstructured logs where you can't easily extract a message format:",[489,2205,2207],{"className":491,"code":2206,"language":493,"meta":494,"style":494},"EventName = \"log\"\n\nlog.severity = \"info\"\nlog.message = \"Connection to database failed after 3 retries\"\ngrouping.fingerprint = \"database connection failed\"\n",[153,2208,2209,2215,2219,2225,2232],{"__ignoreMap":494},[498,2210,2211,2213],{"class":500,"line":501},[498,2212,1320],{"class":504},[498,2214,1770],{"class":508},[498,2216,2217],{"class":500,"line":512},[498,2218,515],{"emptyLinePlaceholder":10},[498,2220,2221,2223],{"class":500,"line":518},[498,2222,1779],{"class":504},[498,2224,1782],{"class":508},[498,2226,2227,2229],{"class":500,"line":527},[498,2228,1787],{"class":504},[498,2230,2231],{"class":508},"\"Connection to database failed after 3 retries\"\n",[498,2233,2234,2236],{"class":500,"line":536},[498,2235,598],{"class":504},[498,2237,2238],{"class":508},"\"database connection failed\"\n",[124,2240,2241,2242,2246],{},"See ",[684,2243,2245],{"href":2244},"\u002Fget\u002Flogs","Monitoring Logs"," for details.",[2248,2249,2250],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}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 .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}",{"title":494,"searchDepth":527,"depth":512,"links":2252},[2253,2254,2255,2256,2257,2258],{"id":130,"depth":512,"text":131},{"id":350,"depth":512,"text":351},{"id":463,"depth":512,"text":464},{"id":551,"depth":512,"text":552},{"id":604,"depth":512,"text":605},{"id":648,"depth":512,"text":649,"children":2259},[2260,2261,2262,2263,2264,2265,2266,2267],{"id":155,"depth":518,"text":223},{"id":801,"depth":518,"text":261},{"id":861,"depth":518,"text":236},{"id":965,"depth":518,"text":966},{"id":1072,"depth":518,"text":1073},{"id":1144,"depth":518,"text":1145},{"id":1296,"depth":518,"text":333},{"id":1745,"depth":518,"text":29},"Optimize grouping by choosing stable span names, leveraging display.name, and providing custom fingerprints when needed.","md",null,{"readingTime":2272},{"text":2273,"minutes":2274,"time":2275,"words":2276},"6 min read",5.78,346800,1156,{"title":17},{"title":119,"description":2268},"QXI5Q5Z_-AS1p32JG27xluwOyzrY2T844iJUDIgM2gg",[2281,2283],{"title":15,"path":11,"stem":12,"description":2282,"children":-1},"Explore spans and traces in Uptrace using filters, aggregations, operation detail panels, and the full trace waterfall to find and diagnose errors.",{"title":21,"path":22,"stem":23,"description":2284,"children":-1},"Master the Uptrace span query language including identifiers, filters, grouping, and aggregates for traces, logs, and events.",1778588617782]