[{"data":1,"prerenderedAt":2801},["ShallowReactive",2],{"\u002Ffeatures\u002Fobservability-as-code-navigation":3,"\u002Ffeatures\u002Fobservability-as-code":120},[4,8,28,38,52,56,60,64,74,78,82,86,90,94,98,102],{"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},"Searching","\u002Ffeatures\u002Fsearching","features\u002F04.searching",{"title":61,"path":62,"stem":63},"Chart annotations","\u002Ffeatures\u002Fannotations","features\u002F05.annotations",{"title":65,"path":66,"stem":67,"children":68,"closed":10},"Dashboards","\u002Ffeatures\u002Fdashboards","features\u002F06.dashboards\u002F01.index",[69,70],{"title":65,"path":66,"stem":67},{"title":71,"path":72,"stem":73},"YAML Templates","\u002Ffeatures\u002Fdashboards\u002Fyaml","features\u002F06.dashboards\u002F02.yaml",{"title":75,"path":76,"stem":77},"Transformations","\u002Ffeatures\u002Ftransformations","features\u002F07.transformations",{"title":79,"path":80,"stem":81},"Service graph","\u002Ffeatures\u002Fservice-graph","features\u002F08.service-graph",{"title":83,"path":84,"stem":85},"Grafana integration","\u002Ffeatures\u002Fgrafana","features\u002F09.grafana",{"title":87,"path":88,"stem":89},"Data fixtures","\u002Ffeatures\u002Ffixtures","features\u002F10.fixtures",{"title":91,"path":92,"stem":93},"JavaScript Source Maps","\u002Ffeatures\u002Fsourcemaps","features\u002F11.sourcemaps",{"title":95,"path":96,"stem":97},"MCP Server","\u002Ffeatures\u002Fmcp","features\u002F12.mcp",{"title":99,"path":100,"stem":101},"Observability as Code","\u002Ffeatures\u002Fobservability-as-code","features\u002F13.observability-as-code",{"title":103,"closed":10,"path":104,"stem":105,"children":106,"page":119},"SSO","\u002Ffeatures\u002Fsso","features\u002Fsso",[107,111,115],{"title":108,"path":109,"stem":110},"Google","\u002Ffeatures\u002Fsso\u002Fgoogle","features\u002Fsso\u002F01.google",{"title":112,"path":113,"stem":114},"Okta","\u002Ffeatures\u002Fsso\u002Fokta","features\u002Fsso\u002F02.okta",{"title":116,"path":117,"stem":118},"Keycloak","\u002Ffeatures\u002Fsso\u002Fkeycloak","features\u002Fsso\u002F03.keycloak",false,{"page":121,"surround":2796},{"id":122,"title":99,"body":123,"description":2785,"extension":2786,"image":2787,"meta":2788,"navigation":10,"path":100,"seo":2794,"stem":101,"surround_disabled":119,"__hash__":2795},"features\u002Ffeatures\u002F13.observability-as-code.md",{"type":124,"value":125,"toc":2769},"minimark",[126,144,150,155,158,201,205,305,309,317,485,503,508,511,711,714,826,830,833,1122,1143,1146,1149,1532,1535,1656,1659,1662,1907,1914,2021,2025,2028,2161,2164,2167,2342,2349,2352,2355,2358,2404,2407,2459,2465,2469,2472,2480,2483,2505,2510,2514,2520,2582,2585,2639,2644,2648,2654,2759,2765],[127,128,129,130,137,138,143],"p",{},"Uptrace lets you define your observability setup as code. Organizations, projects, alert monitors, notification channels, and team access can all be managed with ",[131,132,136],"a",{"href":133,"rel":134},"https:\u002F\u002Fwww.terraform.io\u002F",[135],"nofollow","Terraform"," using the official ",[131,139,142],{"href":140,"rel":141},"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fuptrace\u002Fuptrace\u002Flatest",[135],"Uptrace provider"," — making your monitoring setup reproducible, auditable, and consistent across environments.",[127,145,146,147,149],{},"Dashboards and data transformation rules are managed as YAML files, imported via the Uptrace UI or ",[131,148,95],{"href":96},".",[151,152,154],"h2",{"id":153},"why-observability-as-code","Why Observability as Code",[127,156,157],{},"When your observability config lives in code rather than UI state:",[159,160,161,169,175,181,187],"ul",{},[162,163,164,168],"li",{},[165,166,167],"strong",{},"Reproducibility"," — replicate your monitoring setup across environments from the same source files",[162,170,171,174],{},[165,172,173],{},"Version control"," — every change is tracked in git history",[162,176,177,180],{},[165,178,179],{},"Portability"," — copy a working setup from staging to production",[162,182,183,186],{},[165,184,185],{},"Collaboration"," — the whole team can review and propose changes via pull requests",[162,188,189,192,193,197,198],{},[165,190,191],{},"Automation"," — integrate with CI\u002FCD pipelines using ",[194,195,196],"code",{},"terraform plan"," and ",[194,199,200],{},"terraform apply",[151,202,204],{"id":203},"what-you-can-manage-as-code","What you can manage as code",[206,207,208,224],"table",{},[209,210,211],"thead",{},[212,213,214,218,221],"tr",{},[215,216,217],"th",{},"Component",[215,219,220],{},"Method",[215,222,223],{},"What it controls",[225,226,227,241,254,267,280,293],"tbody",{},[212,228,229,236,238],{},[230,231,232],"td",{},[131,233,235],{"href":234},"#organizations-and-projects","Organizations & projects",[230,237,136],{},[230,239,240],{},"Orgs, projects, retention policies, ingest tokens",[212,242,243,249,251],{},[230,244,245],{},[131,246,248],{"href":247},"#users-and-teams","Users & teams",[230,250,136],{},[230,252,253],{},"User invitations, org roles, team membership, project access",[212,255,256,262,264],{},[230,257,258],{},[131,259,261],{"href":260},"#monitors","Monitors",[230,263,136],{},[230,265,266],{},"Alert thresholds, anomaly detection, MQL queries",[212,268,269,275,277],{},[230,270,271],{},[131,272,274],{"href":273},"#notification-channels","Notification channels",[230,276,136],{},[230,278,279],{},"Slack, PagerDuty, OpsGenie, webhooks, and more",[212,281,282,287,290],{},[230,283,284],{},[131,285,65],{"href":286},"#dashboards",[230,288,289],{},"YAML",[230,291,292],{},"Chart layouts, metric queries, table views, bundled monitors",[212,294,295,300,302],{},[230,296,297],{},[131,298,75],{"href":299},"#transformations",[230,301,289],{},[230,303,304],{},"Attribute renaming, sampling rules, drop filters",[151,306,308],{"id":307},"terraform-provider","Terraform provider",[127,310,311,312,316],{},"Install the ",[131,313,315],{"href":140,"rel":314},[135],"Uptrace Terraform provider"," and configure it with your API endpoint and token:",[318,319,324],"pre",{"className":320,"code":321,"language":322,"meta":323,"style":323},"language-hcl shiki shiki-themes github-light","terraform {\n  required_providers {\n    uptrace = {\n      source = \"uptrace\u002Fuptrace\"\n    }\n  }\n}\n\nprovider \"uptrace\" {\n  endpoint = \"https:\u002F\u002Fapi.uptrace.dev\"\n  token    = var.uptrace_token\n}\n\nvariable \"uptrace_token\" {\n  type      = string\n  sensitive = true\n}\n","hcl","",[194,325,326,339,347,359,372,378,384,390,396,408,419,436,441,446,457,469,480],{"__ignoreMap":323},[327,328,331,335],"span",{"class":329,"line":330},"line",1,[327,332,334],{"class":333},"s7eDp","terraform",[327,336,338],{"class":337},"sgsFI"," {\n",[327,340,342,345],{"class":329,"line":341},2,[327,343,344],{"class":333},"  required_providers",[327,346,338],{"class":337},[327,348,350,353,357],{"class":329,"line":349},3,[327,351,352],{"class":337},"    uptrace",[327,354,356],{"class":355},"sD7c4"," =",[327,358,338],{"class":337},[327,360,362,365,368],{"class":329,"line":361},4,[327,363,364],{"class":337},"      source ",[327,366,367],{"class":355},"=",[327,369,371],{"class":370},"sYBdl"," \"uptrace\u002Fuptrace\"\n",[327,373,375],{"class":329,"line":374},5,[327,376,377],{"class":337},"    }\n",[327,379,381],{"class":329,"line":380},6,[327,382,383],{"class":337},"  }\n",[327,385,387],{"class":329,"line":386},7,[327,388,389],{"class":337},"}\n",[327,391,393],{"class":329,"line":392},8,[327,394,395],{"emptyLinePlaceholder":10},"\n",[327,397,399,402,406],{"class":329,"line":398},9,[327,400,401],{"class":333},"provider",[327,403,405],{"class":404},"sYu0t"," \"uptrace\"",[327,407,338],{"class":337},[327,409,411,414,416],{"class":329,"line":410},10,[327,412,413],{"class":337},"  endpoint",[327,415,356],{"class":355},[327,417,418],{"class":370}," \"https:\u002F\u002Fapi.uptrace.dev\"\n",[327,420,422,425,428,431,433],{"class":329,"line":421},11,[327,423,424],{"class":337},"  token",[327,426,427],{"class":355},"    =",[327,429,430],{"class":337}," var",[327,432,149],{"class":355},[327,434,435],{"class":337},"uptrace_token\n",[327,437,439],{"class":329,"line":438},12,[327,440,389],{"class":337},[327,442,444],{"class":329,"line":443},13,[327,445,395],{"emptyLinePlaceholder":10},[327,447,449,452,455],{"class":329,"line":448},14,[327,450,451],{"class":333},"variable",[327,453,454],{"class":404}," \"uptrace_token\"",[327,456,338],{"class":337},[327,458,460,463,466],{"class":329,"line":459},15,[327,461,462],{"class":337},"  type",[327,464,465],{"class":355},"      =",[327,467,468],{"class":355}," string\n",[327,470,472,475,477],{"class":329,"line":471},16,[327,473,474],{"class":337},"  sensitive",[327,476,356],{"class":355},[327,478,479],{"class":404}," true\n",[327,481,483],{"class":329,"line":482},17,[327,484,389],{"class":337},[127,486,487,488,197,491,494,495,498,499,502],{},"The provider also reads from ",[194,489,490],{},"UPTRACE_ENDPOINT",[194,492,493],{},"UPTRACE_TOKEN"," environment variables. For self-hosted Uptrace, point ",[194,496,497],{},"endpoint"," to your instance (e.g., ",[194,500,501],{},"http:\u002F\u002Flocalhost:14318",").",[504,505,507],"h3",{"id":506},"organizations-and-projects","Organizations and projects",[127,509,510],{},"Create an organization, a project with a 30-day span retention policy, and an ingest token:",[318,512,514],{"className":320,"code":513,"language":322,"meta":323,"style":323},"resource \"uptrace_org\" \"main\" {\n  name = \"My Organization\"\n}\n\nresource \"uptrace_project\" \"api\" {\n  org_id         = uptrace_org.main.id\n  name           = \"api\"\n  span_retention = \"30d\"\n}\n\nresource \"uptrace_project_token\" \"api\" {\n  project_id = uptrace_project.api.id\n  name       = \"default\"\n}\n\noutput \"project_dsn\" {\n  description = \"Ingest DSN — pass this to your OpenTelemetry SDK\"\n  value       = uptrace_project_token.api.dsn\n  sensitive   = true\n}\n",[194,515,516,529,539,543,547,559,580,590,600,604,608,619,638,648,652,656,666,676,696,706],{"__ignoreMap":323},[327,517,518,521,524,527],{"class":329,"line":330},[327,519,520],{"class":333},"resource",[327,522,523],{"class":404}," \"uptrace_org\"",[327,525,526],{"class":404}," \"main\"",[327,528,338],{"class":337},[327,530,531,534,536],{"class":329,"line":341},[327,532,533],{"class":337},"  name",[327,535,356],{"class":355},[327,537,538],{"class":370}," \"My Organization\"\n",[327,540,541],{"class":329,"line":349},[327,542,389],{"class":337},[327,544,545],{"class":329,"line":361},[327,546,395],{"emptyLinePlaceholder":10},[327,548,549,551,554,557],{"class":329,"line":374},[327,550,520],{"class":333},[327,552,553],{"class":404}," \"uptrace_project\"",[327,555,556],{"class":404}," \"api\"",[327,558,338],{"class":337},[327,560,561,564,567,570,572,575,577],{"class":329,"line":380},[327,562,563],{"class":337},"  org_id",[327,565,566],{"class":355},"         =",[327,568,569],{"class":337}," uptrace_org",[327,571,149],{"class":355},[327,573,574],{"class":337},"main",[327,576,149],{"class":355},[327,578,579],{"class":337},"id\n",[327,581,582,584,587],{"class":329,"line":386},[327,583,533],{"class":337},[327,585,586],{"class":355},"           =",[327,588,589],{"class":370}," \"api\"\n",[327,591,592,595,597],{"class":329,"line":392},[327,593,594],{"class":337},"  span_retention",[327,596,356],{"class":355},[327,598,599],{"class":370}," \"30d\"\n",[327,601,602],{"class":329,"line":398},[327,603,389],{"class":337},[327,605,606],{"class":329,"line":410},[327,607,395],{"emptyLinePlaceholder":10},[327,609,610,612,615,617],{"class":329,"line":421},[327,611,520],{"class":333},[327,613,614],{"class":404}," \"uptrace_project_token\"",[327,616,556],{"class":404},[327,618,338],{"class":337},[327,620,621,624,626,629,631,634,636],{"class":329,"line":438},[327,622,623],{"class":337},"  project_id",[327,625,356],{"class":355},[327,627,628],{"class":337}," uptrace_project",[327,630,149],{"class":355},[327,632,633],{"class":337},"api",[327,635,149],{"class":355},[327,637,579],{"class":337},[327,639,640,642,645],{"class":329,"line":443},[327,641,533],{"class":337},[327,643,644],{"class":355},"       =",[327,646,647],{"class":370}," \"default\"\n",[327,649,650],{"class":329,"line":448},[327,651,389],{"class":337},[327,653,654],{"class":329,"line":459},[327,655,395],{"emptyLinePlaceholder":10},[327,657,658,661,664],{"class":329,"line":471},[327,659,660],{"class":333},"output",[327,662,663],{"class":404}," \"project_dsn\"",[327,665,338],{"class":337},[327,667,668,671,673],{"class":329,"line":482},[327,669,670],{"class":337},"  description",[327,672,356],{"class":355},[327,674,675],{"class":370}," \"Ingest DSN — pass this to your OpenTelemetry SDK\"\n",[327,677,679,682,684,687,689,691,693],{"class":329,"line":678},18,[327,680,681],{"class":337},"  value",[327,683,644],{"class":355},[327,685,686],{"class":337}," uptrace_project_token",[327,688,149],{"class":355},[327,690,633],{"class":337},[327,692,149],{"class":355},[327,694,695],{"class":337},"dsn\n",[327,697,699,701,704],{"class":329,"line":698},19,[327,700,474],{"class":337},[327,702,703],{"class":355},"   =",[327,705,479],{"class":404},[327,707,709],{"class":329,"line":708},20,[327,710,389],{"class":337},[127,712,713],{},"Projects support per-signal retention and query time-range defaults:",[206,715,716,726],{},[209,717,718],{},[212,719,720,723],{},[215,721,722],{},"Attribute",[215,724,725],{},"Description",[225,727,728,746,756,766,776,786,796,806,816],{},[212,729,730,735],{},[230,731,732],{},[194,733,734],{},"span_retention",[230,736,737,738,741,742,745],{},"Data retention for spans (e.g. ",[194,739,740],{},"30d",", ",[194,743,744],{},"2w",")",[212,747,748,753],{},[230,749,750],{},[194,751,752],{},"log_retention",[230,754,755],{},"Data retention for logs",[212,757,758,763],{},[230,759,760],{},[194,761,762],{},"event_retention",[230,764,765],{},"Data retention for events",[212,767,768,773],{},[230,769,770],{},[194,771,772],{},"metric_retention",[230,774,775],{},"Data retention for metrics",[212,777,778,783],{},[230,779,780],{},[194,781,782],{},"span_time_range",[230,784,785],{},"Default query time range for spans",[212,787,788,793],{},[230,789,790],{},[194,791,792],{},"log_time_range",[230,794,795],{},"Default query time range for logs",[212,797,798,803],{},[230,799,800],{},[194,801,802],{},"event_time_range",[230,804,805],{},"Default query time range for events",[212,807,808,813],{},[230,809,810],{},[194,811,812],{},"group_by_env",[230,814,815],{},"Group spans by environment",[212,817,818,823],{},[230,819,820],{},[194,821,822],{},"group_funcs_by_service",[230,824,825],{},"Group functions by service",[504,827,829],{"id":828},"users-and-teams","Users and teams",[127,831,832],{},"Invite users, assign organization roles, and manage team-based project access:",[318,834,836],{"className":320,"code":835,"language":322,"meta":323,"style":323},"resource \"uptrace_user\" \"alice\" {\n  email = \"alice@example.com\"\n}\n\nresource \"uptrace_org_user\" \"alice\" {\n  org_id  = uptrace_org.main.id\n  user_id = uptrace_user.alice.id\n  role    = \"admin\"\n}\n\nresource \"uptrace_team\" \"platform\" {\n  org_id = uptrace_org.main.id\n  name   = \"Platform\"\n}\n\nresource \"uptrace_team_user\" \"alice_platform\" {\n  org_id      = uptrace_org.main.id\n  team_id     = uptrace_team.platform.id\n  org_user_id = uptrace_org_user.alice.id\n}\n\nresource \"uptrace_team_project\" \"platform_api\" {\n  org_id     = uptrace_org.main.id\n  team_id    = uptrace_team.platform.id\n  project_id = uptrace_project.api.id\n}\n",[194,837,838,850,860,864,868,879,896,915,925,929,933,945,961,970,974,978,990,1006,1026,1044,1048,1053,1066,1083,1100,1117],{"__ignoreMap":323},[327,839,840,842,845,848],{"class":329,"line":330},[327,841,520],{"class":333},[327,843,844],{"class":404}," \"uptrace_user\"",[327,846,847],{"class":404}," \"alice\"",[327,849,338],{"class":337},[327,851,852,855,857],{"class":329,"line":341},[327,853,854],{"class":337},"  email",[327,856,356],{"class":355},[327,858,859],{"class":370}," \"alice@example.com\"\n",[327,861,862],{"class":329,"line":349},[327,863,389],{"class":337},[327,865,866],{"class":329,"line":361},[327,867,395],{"emptyLinePlaceholder":10},[327,869,870,872,875,877],{"class":329,"line":374},[327,871,520],{"class":333},[327,873,874],{"class":404}," \"uptrace_org_user\"",[327,876,847],{"class":404},[327,878,338],{"class":337},[327,880,881,883,886,888,890,892,894],{"class":329,"line":380},[327,882,563],{"class":337},[327,884,885],{"class":355},"  =",[327,887,569],{"class":337},[327,889,149],{"class":355},[327,891,574],{"class":337},[327,893,149],{"class":355},[327,895,579],{"class":337},[327,897,898,901,903,906,908,911,913],{"class":329,"line":386},[327,899,900],{"class":337},"  user_id",[327,902,356],{"class":355},[327,904,905],{"class":337}," uptrace_user",[327,907,149],{"class":355},[327,909,910],{"class":337},"alice",[327,912,149],{"class":355},[327,914,579],{"class":337},[327,916,917,920,922],{"class":329,"line":392},[327,918,919],{"class":337},"  role",[327,921,427],{"class":355},[327,923,924],{"class":370}," \"admin\"\n",[327,926,927],{"class":329,"line":398},[327,928,389],{"class":337},[327,930,931],{"class":329,"line":410},[327,932,395],{"emptyLinePlaceholder":10},[327,934,935,937,940,943],{"class":329,"line":421},[327,936,520],{"class":333},[327,938,939],{"class":404}," \"uptrace_team\"",[327,941,942],{"class":404}," \"platform\"",[327,944,338],{"class":337},[327,946,947,949,951,953,955,957,959],{"class":329,"line":438},[327,948,563],{"class":337},[327,950,356],{"class":355},[327,952,569],{"class":337},[327,954,149],{"class":355},[327,956,574],{"class":337},[327,958,149],{"class":355},[327,960,579],{"class":337},[327,962,963,965,967],{"class":329,"line":443},[327,964,533],{"class":337},[327,966,703],{"class":355},[327,968,969],{"class":370}," \"Platform\"\n",[327,971,972],{"class":329,"line":448},[327,973,389],{"class":337},[327,975,976],{"class":329,"line":459},[327,977,395],{"emptyLinePlaceholder":10},[327,979,980,982,985,988],{"class":329,"line":471},[327,981,520],{"class":333},[327,983,984],{"class":404}," \"uptrace_team_user\"",[327,986,987],{"class":404}," \"alice_platform\"",[327,989,338],{"class":337},[327,991,992,994,996,998,1000,1002,1004],{"class":329,"line":482},[327,993,563],{"class":337},[327,995,465],{"class":355},[327,997,569],{"class":337},[327,999,149],{"class":355},[327,1001,574],{"class":337},[327,1003,149],{"class":355},[327,1005,579],{"class":337},[327,1007,1008,1011,1014,1017,1019,1022,1024],{"class":329,"line":678},[327,1009,1010],{"class":337},"  team_id",[327,1012,1013],{"class":355},"     =",[327,1015,1016],{"class":337}," uptrace_team",[327,1018,149],{"class":355},[327,1020,1021],{"class":337},"platform",[327,1023,149],{"class":355},[327,1025,579],{"class":337},[327,1027,1028,1031,1033,1036,1038,1040,1042],{"class":329,"line":698},[327,1029,1030],{"class":337},"  org_user_id",[327,1032,356],{"class":355},[327,1034,1035],{"class":337}," uptrace_org_user",[327,1037,149],{"class":355},[327,1039,910],{"class":337},[327,1041,149],{"class":355},[327,1043,579],{"class":337},[327,1045,1046],{"class":329,"line":708},[327,1047,389],{"class":337},[327,1049,1051],{"class":329,"line":1050},21,[327,1052,395],{"emptyLinePlaceholder":10},[327,1054,1056,1058,1061,1064],{"class":329,"line":1055},22,[327,1057,520],{"class":333},[327,1059,1060],{"class":404}," \"uptrace_team_project\"",[327,1062,1063],{"class":404}," \"platform_api\"",[327,1065,338],{"class":337},[327,1067,1069,1071,1073,1075,1077,1079,1081],{"class":329,"line":1068},23,[327,1070,563],{"class":337},[327,1072,1013],{"class":355},[327,1074,569],{"class":337},[327,1076,149],{"class":355},[327,1078,574],{"class":337},[327,1080,149],{"class":355},[327,1082,579],{"class":337},[327,1084,1086,1088,1090,1092,1094,1096,1098],{"class":329,"line":1085},24,[327,1087,1010],{"class":337},[327,1089,427],{"class":355},[327,1091,1016],{"class":337},[327,1093,149],{"class":355},[327,1095,1021],{"class":337},[327,1097,149],{"class":355},[327,1099,579],{"class":337},[327,1101,1103,1105,1107,1109,1111,1113,1115],{"class":329,"line":1102},25,[327,1104,623],{"class":337},[327,1106,356],{"class":355},[327,1108,628],{"class":337},[327,1110,149],{"class":355},[327,1112,633],{"class":337},[327,1114,149],{"class":355},[327,1116,579],{"class":337},[327,1118,1120],{"class":329,"line":1119},26,[327,1121,389],{"class":337},[127,1123,1124,1125,741,1128,741,1131,741,1134,741,1137,741,1140,149],{},"Available organization roles: ",[194,1126,1127],{},"owner",[194,1129,1130],{},"admin",[194,1132,1133],{},"member",[194,1135,1136],{},"viewer",[194,1138,1139],{},"billing_manager",[194,1141,1142],{},"collaborator",[504,1144,261],{"id":1145},"monitors",[127,1147,1148],{},"Define metric monitors with manual thresholds or automatic anomaly detection:",[318,1150,1152],{"className":320,"code":1151,"language":322,"meta":323,"style":323},"resource \"uptrace_metric_monitor\" \"error_rate\" {\n  project_id                = uptrace_project.api.id\n  name                      = \"High error rate\"\n  notify_everyone_by_email  = true\n\n  params = {\n    metrics = [\n      { name = \"uptrace_tracing_spans\", alias = \"$spans\" }\n    ]\n    query  = \"_error_rate | where _type = \\\"httpserver\\\" | group by service_name\"\n    column = { name = \"_error_rate\" }\n\n    num_eval_points = 5\n    detector = {\n      manual = {\n        max_value = 0.05\n      }\n    }\n  }\n}\n\nresource \"uptrace_metric_monitor\" \"latency_anomaly\" {\n  project_id = uptrace_project.api.id\n  name       = \"HTTP latency spike\"\n\n  params = {\n    metrics = [\n      { name = \"uptrace_tracing_spans\", alias = \"$http_duration\" }\n    ]\n    query  = \"avg($http_duration)\"\n    column = { name = \"avg($http_duration)\", unit = \"milliseconds\" }\n\n    detector = {\n      auto = {\n        tolerance       = \"medium\"\n        training_period = 86400000\n      }\n    }\n  }\n}\n",[194,1153,1154,1166,1183,1193,1202,1206,1215,1225,1246,1251,1272,1289,1293,1303,1312,1321,1331,1336,1340,1344,1348,1352,1363,1379,1388,1392,1400,1409,1427,1432,1442,1466,1471,1480,1490,1501,1512,1517,1522,1527],{"__ignoreMap":323},[327,1155,1156,1158,1161,1164],{"class":329,"line":330},[327,1157,520],{"class":333},[327,1159,1160],{"class":404}," \"uptrace_metric_monitor\"",[327,1162,1163],{"class":404}," \"error_rate\"",[327,1165,338],{"class":337},[327,1167,1168,1170,1173,1175,1177,1179,1181],{"class":329,"line":341},[327,1169,623],{"class":337},[327,1171,1172],{"class":355},"                =",[327,1174,628],{"class":337},[327,1176,149],{"class":355},[327,1178,633],{"class":337},[327,1180,149],{"class":355},[327,1182,579],{"class":337},[327,1184,1185,1187,1190],{"class":329,"line":349},[327,1186,533],{"class":337},[327,1188,1189],{"class":355},"                      =",[327,1191,1192],{"class":370}," \"High error rate\"\n",[327,1194,1195,1198,1200],{"class":329,"line":361},[327,1196,1197],{"class":337},"  notify_everyone_by_email",[327,1199,885],{"class":355},[327,1201,479],{"class":404},[327,1203,1204],{"class":329,"line":374},[327,1205,395],{"emptyLinePlaceholder":10},[327,1207,1208,1211,1213],{"class":329,"line":380},[327,1209,1210],{"class":337},"  params",[327,1212,356],{"class":355},[327,1214,338],{"class":337},[327,1216,1217,1220,1222],{"class":329,"line":386},[327,1218,1219],{"class":337},"    metrics ",[327,1221,367],{"class":355},[327,1223,1224],{"class":337}," [\n",[327,1226,1227,1230,1232,1235,1238,1240,1243],{"class":329,"line":392},[327,1228,1229],{"class":337},"      { name ",[327,1231,367],{"class":355},[327,1233,1234],{"class":370}," \"uptrace_tracing_spans\"",[327,1236,1237],{"class":337},", alias ",[327,1239,367],{"class":355},[327,1241,1242],{"class":370}," \"$spans\"",[327,1244,1245],{"class":337}," }\n",[327,1247,1248],{"class":329,"line":398},[327,1249,1250],{"class":337},"    ]\n",[327,1252,1253,1256,1258,1261,1264,1267,1269],{"class":329,"line":410},[327,1254,1255],{"class":337},"    query  ",[327,1257,367],{"class":355},[327,1259,1260],{"class":370}," \"_error_rate | where _type = ",[327,1262,1263],{"class":404},"\\\"",[327,1265,1266],{"class":370},"httpserver",[327,1268,1263],{"class":404},[327,1270,1271],{"class":370}," | group by service_name\"\n",[327,1273,1274,1277,1279,1282,1284,1287],{"class":329,"line":421},[327,1275,1276],{"class":337},"    column ",[327,1278,367],{"class":355},[327,1280,1281],{"class":337}," { name ",[327,1283,367],{"class":355},[327,1285,1286],{"class":370}," \"_error_rate\"",[327,1288,1245],{"class":337},[327,1290,1291],{"class":329,"line":438},[327,1292,395],{"emptyLinePlaceholder":10},[327,1294,1295,1298,1300],{"class":329,"line":443},[327,1296,1297],{"class":337},"    num_eval_points ",[327,1299,367],{"class":355},[327,1301,1302],{"class":404}," 5\n",[327,1304,1305,1308,1310],{"class":329,"line":448},[327,1306,1307],{"class":337},"    detector ",[327,1309,367],{"class":355},[327,1311,338],{"class":337},[327,1313,1314,1317,1319],{"class":329,"line":459},[327,1315,1316],{"class":337},"      manual ",[327,1318,367],{"class":355},[327,1320,338],{"class":337},[327,1322,1323,1326,1328],{"class":329,"line":471},[327,1324,1325],{"class":337},"        max_value ",[327,1327,367],{"class":355},[327,1329,1330],{"class":404}," 0.05\n",[327,1332,1333],{"class":329,"line":482},[327,1334,1335],{"class":337},"      }\n",[327,1337,1338],{"class":329,"line":678},[327,1339,377],{"class":337},[327,1341,1342],{"class":329,"line":698},[327,1343,383],{"class":337},[327,1345,1346],{"class":329,"line":708},[327,1347,389],{"class":337},[327,1349,1350],{"class":329,"line":1050},[327,1351,395],{"emptyLinePlaceholder":10},[327,1353,1354,1356,1358,1361],{"class":329,"line":1055},[327,1355,520],{"class":333},[327,1357,1160],{"class":404},[327,1359,1360],{"class":404}," \"latency_anomaly\"",[327,1362,338],{"class":337},[327,1364,1365,1367,1369,1371,1373,1375,1377],{"class":329,"line":1068},[327,1366,623],{"class":337},[327,1368,356],{"class":355},[327,1370,628],{"class":337},[327,1372,149],{"class":355},[327,1374,633],{"class":337},[327,1376,149],{"class":355},[327,1378,579],{"class":337},[327,1380,1381,1383,1385],{"class":329,"line":1085},[327,1382,533],{"class":337},[327,1384,644],{"class":355},[327,1386,1387],{"class":370}," \"HTTP latency spike\"\n",[327,1389,1390],{"class":329,"line":1102},[327,1391,395],{"emptyLinePlaceholder":10},[327,1393,1394,1396,1398],{"class":329,"line":1119},[327,1395,1210],{"class":337},[327,1397,356],{"class":355},[327,1399,338],{"class":337},[327,1401,1403,1405,1407],{"class":329,"line":1402},27,[327,1404,1219],{"class":337},[327,1406,367],{"class":355},[327,1408,1224],{"class":337},[327,1410,1412,1414,1416,1418,1420,1422,1425],{"class":329,"line":1411},28,[327,1413,1229],{"class":337},[327,1415,367],{"class":355},[327,1417,1234],{"class":370},[327,1419,1237],{"class":337},[327,1421,367],{"class":355},[327,1423,1424],{"class":370}," \"$http_duration\"",[327,1426,1245],{"class":337},[327,1428,1430],{"class":329,"line":1429},29,[327,1431,1250],{"class":337},[327,1433,1435,1437,1439],{"class":329,"line":1434},30,[327,1436,1255],{"class":337},[327,1438,367],{"class":355},[327,1440,1441],{"class":370}," \"avg($http_duration)\"\n",[327,1443,1445,1447,1449,1451,1453,1456,1459,1461,1464],{"class":329,"line":1444},31,[327,1446,1276],{"class":337},[327,1448,367],{"class":355},[327,1450,1281],{"class":337},[327,1452,367],{"class":355},[327,1454,1455],{"class":370}," \"avg($http_duration)\"",[327,1457,1458],{"class":337},", unit ",[327,1460,367],{"class":355},[327,1462,1463],{"class":370}," \"milliseconds\"",[327,1465,1245],{"class":337},[327,1467,1469],{"class":329,"line":1468},32,[327,1470,395],{"emptyLinePlaceholder":10},[327,1472,1474,1476,1478],{"class":329,"line":1473},33,[327,1475,1307],{"class":337},[327,1477,367],{"class":355},[327,1479,338],{"class":337},[327,1481,1483,1486,1488],{"class":329,"line":1482},34,[327,1484,1485],{"class":337},"      auto ",[327,1487,367],{"class":355},[327,1489,338],{"class":337},[327,1491,1493,1496,1498],{"class":329,"line":1492},35,[327,1494,1495],{"class":337},"        tolerance       ",[327,1497,367],{"class":355},[327,1499,1500],{"class":370}," \"medium\"\n",[327,1502,1504,1507,1509],{"class":329,"line":1503},36,[327,1505,1506],{"class":337},"        training_period ",[327,1508,367],{"class":355},[327,1510,1511],{"class":404}," 86400000\n",[327,1513,1515],{"class":329,"line":1514},37,[327,1516,1335],{"class":337},[327,1518,1520],{"class":329,"line":1519},38,[327,1521,377],{"class":337},[327,1523,1525],{"class":329,"line":1524},39,[327,1526,383],{"class":337},[327,1528,1530],{"class":329,"line":1529},40,[327,1531,389],{"class":337},[127,1533,1534],{},"Error monitors watch for trend anomalies in log and span data:",[318,1536,1538],{"className":320,"code":1537,"language":322,"meta":323,"style":323},"resource \"uptrace_error_monitor\" \"log_errors\" {\n  project_id = uptrace_project.api.id\n  name       = \"Notify on all errors\"\n\n  params = {\n    metrics = [\n      { name = \"uptrace_tracing_logs\", alias = \"$logs\" }\n    ]\n    query = \"sum($logs) | where _system in (\\\"log:error\\\", \\\"log:fatal\\\")\"\n  }\n}\n",[194,1539,1540,1552,1568,1577,1581,1589,1597,1615,1619,1648,1652],{"__ignoreMap":323},[327,1541,1542,1544,1547,1550],{"class":329,"line":330},[327,1543,520],{"class":333},[327,1545,1546],{"class":404}," \"uptrace_error_monitor\"",[327,1548,1549],{"class":404}," \"log_errors\"",[327,1551,338],{"class":337},[327,1553,1554,1556,1558,1560,1562,1564,1566],{"class":329,"line":341},[327,1555,623],{"class":337},[327,1557,356],{"class":355},[327,1559,628],{"class":337},[327,1561,149],{"class":355},[327,1563,633],{"class":337},[327,1565,149],{"class":355},[327,1567,579],{"class":337},[327,1569,1570,1572,1574],{"class":329,"line":349},[327,1571,533],{"class":337},[327,1573,644],{"class":355},[327,1575,1576],{"class":370}," \"Notify on all errors\"\n",[327,1578,1579],{"class":329,"line":361},[327,1580,395],{"emptyLinePlaceholder":10},[327,1582,1583,1585,1587],{"class":329,"line":374},[327,1584,1210],{"class":337},[327,1586,356],{"class":355},[327,1588,338],{"class":337},[327,1590,1591,1593,1595],{"class":329,"line":380},[327,1592,1219],{"class":337},[327,1594,367],{"class":355},[327,1596,1224],{"class":337},[327,1598,1599,1601,1603,1606,1608,1610,1613],{"class":329,"line":386},[327,1600,1229],{"class":337},[327,1602,367],{"class":355},[327,1604,1605],{"class":370}," \"uptrace_tracing_logs\"",[327,1607,1237],{"class":337},[327,1609,367],{"class":355},[327,1611,1612],{"class":370}," \"$logs\"",[327,1614,1245],{"class":337},[327,1616,1617],{"class":329,"line":392},[327,1618,1250],{"class":337},[327,1620,1621,1624,1626,1629,1631,1634,1636,1638,1640,1643,1645],{"class":329,"line":398},[327,1622,1623],{"class":337},"    query ",[327,1625,367],{"class":355},[327,1627,1628],{"class":370}," \"sum($logs) | where _system in (",[327,1630,1263],{"class":404},[327,1632,1633],{"class":370},"log:error",[327,1635,1263],{"class":404},[327,1637,741],{"class":370},[327,1639,1263],{"class":404},[327,1641,1642],{"class":370},"log:fatal",[327,1644,1263],{"class":404},[327,1646,1647],{"class":370},")\"\n",[327,1649,1650],{"class":329,"line":410},[327,1651,383],{"class":337},[327,1653,1654],{"class":329,"line":421},[327,1655,389],{"class":337},[504,1657,274],{"id":1658},"notification-channels",[127,1660,1661],{},"Route alerts to your team's tools. The provider supports Slack, PagerDuty, OpsGenie, Telegram, Microsoft Teams, Google Chat, Mattermost, Pushover, ServiceNow, incident.io, Alertmanager, and generic webhooks.",[318,1663,1665],{"className":320,"code":1664,"language":322,"meta":323,"style":323},"resource \"uptrace_slack_channel\" \"alerts\" {\n  project_id  = uptrace_project.api.id\n  name        = \"slack-alerts\"\n  priorities  = [\"high\", \"medium\"]\n  auth_method = \"webhook\"\n  webhook_url = \"https:\u002F\u002Fhooks.slack.com\u002Fservices\u002FT00\u002FB00\u002FXXXX\"\n}\n\nresource \"uptrace_pagerduty_channel\" \"oncall\" {\n  project_id  = uptrace_project.api.id\n  name        = \"pagerduty-oncall\"\n  priorities  = [\"high\"]\n  routing_key = var.pagerduty_routing_key\n  severity    = \"critical\"\n}\n\nresource \"uptrace_webhook_channel\" \"custom\" {\n  project_id = uptrace_project.api.id\n  name       = \"custom-webhook\"\n  priorities = [\"high\", \"medium\", \"low\"]\n  url        = \"https:\u002F\u002Fexample.com\u002Fhooks\u002Falert\"\n}\n",[194,1666,1667,1679,1695,1705,1726,1736,1746,1750,1754,1766,1782,1791,1803,1817,1827,1831,1835,1847,1863,1872,1893,1903],{"__ignoreMap":323},[327,1668,1669,1671,1674,1677],{"class":329,"line":330},[327,1670,520],{"class":333},[327,1672,1673],{"class":404}," \"uptrace_slack_channel\"",[327,1675,1676],{"class":404}," \"alerts\"",[327,1678,338],{"class":337},[327,1680,1681,1683,1685,1687,1689,1691,1693],{"class":329,"line":341},[327,1682,623],{"class":337},[327,1684,885],{"class":355},[327,1686,628],{"class":337},[327,1688,149],{"class":355},[327,1690,633],{"class":337},[327,1692,149],{"class":355},[327,1694,579],{"class":337},[327,1696,1697,1699,1702],{"class":329,"line":349},[327,1698,533],{"class":337},[327,1700,1701],{"class":355},"        =",[327,1703,1704],{"class":370}," \"slack-alerts\"\n",[327,1706,1707,1710,1712,1715,1718,1720,1723],{"class":329,"line":361},[327,1708,1709],{"class":337},"  priorities",[327,1711,885],{"class":355},[327,1713,1714],{"class":337}," [",[327,1716,1717],{"class":370},"\"high\"",[327,1719,741],{"class":337},[327,1721,1722],{"class":370},"\"medium\"",[327,1724,1725],{"class":337},"]\n",[327,1727,1728,1731,1733],{"class":329,"line":374},[327,1729,1730],{"class":337},"  auth_method",[327,1732,356],{"class":355},[327,1734,1735],{"class":370}," \"webhook\"\n",[327,1737,1738,1741,1743],{"class":329,"line":380},[327,1739,1740],{"class":337},"  webhook_url",[327,1742,356],{"class":355},[327,1744,1745],{"class":370}," \"https:\u002F\u002Fhooks.slack.com\u002Fservices\u002FT00\u002FB00\u002FXXXX\"\n",[327,1747,1748],{"class":329,"line":386},[327,1749,389],{"class":337},[327,1751,1752],{"class":329,"line":392},[327,1753,395],{"emptyLinePlaceholder":10},[327,1755,1756,1758,1761,1764],{"class":329,"line":398},[327,1757,520],{"class":333},[327,1759,1760],{"class":404}," \"uptrace_pagerduty_channel\"",[327,1762,1763],{"class":404}," \"oncall\"",[327,1765,338],{"class":337},[327,1767,1768,1770,1772,1774,1776,1778,1780],{"class":329,"line":410},[327,1769,623],{"class":337},[327,1771,885],{"class":355},[327,1773,628],{"class":337},[327,1775,149],{"class":355},[327,1777,633],{"class":337},[327,1779,149],{"class":355},[327,1781,579],{"class":337},[327,1783,1784,1786,1788],{"class":329,"line":421},[327,1785,533],{"class":337},[327,1787,1701],{"class":355},[327,1789,1790],{"class":370}," \"pagerduty-oncall\"\n",[327,1792,1793,1795,1797,1799,1801],{"class":329,"line":438},[327,1794,1709],{"class":337},[327,1796,885],{"class":355},[327,1798,1714],{"class":337},[327,1800,1717],{"class":370},[327,1802,1725],{"class":337},[327,1804,1805,1808,1810,1812,1814],{"class":329,"line":443},[327,1806,1807],{"class":337},"  routing_key",[327,1809,356],{"class":355},[327,1811,430],{"class":337},[327,1813,149],{"class":355},[327,1815,1816],{"class":337},"pagerduty_routing_key\n",[327,1818,1819,1822,1824],{"class":329,"line":448},[327,1820,1821],{"class":337},"  severity",[327,1823,427],{"class":355},[327,1825,1826],{"class":370}," \"critical\"\n",[327,1828,1829],{"class":329,"line":459},[327,1830,389],{"class":337},[327,1832,1833],{"class":329,"line":471},[327,1834,395],{"emptyLinePlaceholder":10},[327,1836,1837,1839,1842,1845],{"class":329,"line":482},[327,1838,520],{"class":333},[327,1840,1841],{"class":404}," \"uptrace_webhook_channel\"",[327,1843,1844],{"class":404}," \"custom\"",[327,1846,338],{"class":337},[327,1848,1849,1851,1853,1855,1857,1859,1861],{"class":329,"line":678},[327,1850,623],{"class":337},[327,1852,356],{"class":355},[327,1854,628],{"class":337},[327,1856,149],{"class":355},[327,1858,633],{"class":337},[327,1860,149],{"class":355},[327,1862,579],{"class":337},[327,1864,1865,1867,1869],{"class":329,"line":698},[327,1866,533],{"class":337},[327,1868,644],{"class":355},[327,1870,1871],{"class":370}," \"custom-webhook\"\n",[327,1873,1874,1876,1878,1880,1882,1884,1886,1888,1891],{"class":329,"line":708},[327,1875,1709],{"class":337},[327,1877,356],{"class":355},[327,1879,1714],{"class":337},[327,1881,1717],{"class":370},[327,1883,741],{"class":337},[327,1885,1722],{"class":370},[327,1887,741],{"class":337},[327,1889,1890],{"class":370},"\"low\"",[327,1892,1725],{"class":337},[327,1894,1895,1898,1900],{"class":329,"line":1050},[327,1896,1897],{"class":337},"  url",[327,1899,1701],{"class":355},[327,1901,1902],{"class":370}," \"https:\u002F\u002Fexample.com\u002Fhooks\u002Falert\"\n",[327,1904,1905],{"class":329,"line":1055},[327,1906,389],{"class":337},[127,1908,1909,1910,1913],{},"Each channel can filter alerts by priority and optionally restrict to specific monitors using ",[194,1911,1912],{},"monitor_ids",":",[318,1915,1917],{"className":320,"code":1916,"language":322,"meta":323,"style":323},"resource \"uptrace_slack_channel\" \"critical_only\" {\n  project_id  = uptrace_project.api.id\n  name        = \"critical-errors\"\n  priorities  = [\"high\"]\n  auth_method = \"webhook\"\n  webhook_url = \"https:\u002F\u002Fhooks.slack.com\u002Fservices\u002FT00\u002FB00\u002FXXXX\"\n\n  match_all   = false\n  monitor_ids = [uptrace_error_monitor.log_errors.id]\n}\n",[194,1918,1919,1930,1946,1955,1967,1975,1983,1987,1997,2017],{"__ignoreMap":323},[327,1920,1921,1923,1925,1928],{"class":329,"line":330},[327,1922,520],{"class":333},[327,1924,1673],{"class":404},[327,1926,1927],{"class":404}," \"critical_only\"",[327,1929,338],{"class":337},[327,1931,1932,1934,1936,1938,1940,1942,1944],{"class":329,"line":341},[327,1933,623],{"class":337},[327,1935,885],{"class":355},[327,1937,628],{"class":337},[327,1939,149],{"class":355},[327,1941,633],{"class":337},[327,1943,149],{"class":355},[327,1945,579],{"class":337},[327,1947,1948,1950,1952],{"class":329,"line":349},[327,1949,533],{"class":337},[327,1951,1701],{"class":355},[327,1953,1954],{"class":370}," \"critical-errors\"\n",[327,1956,1957,1959,1961,1963,1965],{"class":329,"line":361},[327,1958,1709],{"class":337},[327,1960,885],{"class":355},[327,1962,1714],{"class":337},[327,1964,1717],{"class":370},[327,1966,1725],{"class":337},[327,1968,1969,1971,1973],{"class":329,"line":374},[327,1970,1730],{"class":337},[327,1972,356],{"class":355},[327,1974,1735],{"class":370},[327,1976,1977,1979,1981],{"class":329,"line":380},[327,1978,1740],{"class":337},[327,1980,356],{"class":355},[327,1982,1745],{"class":370},[327,1984,1985],{"class":329,"line":386},[327,1986,395],{"emptyLinePlaceholder":10},[327,1988,1989,1992,1994],{"class":329,"line":392},[327,1990,1991],{"class":337},"  match_all",[327,1993,703],{"class":355},[327,1995,1996],{"class":404}," false\n",[327,1998,1999,2002,2004,2007,2009,2012,2014],{"class":329,"line":398},[327,2000,2001],{"class":337},"  monitor_ids",[327,2003,356],{"class":355},[327,2005,2006],{"class":337}," [uptrace_error_monitor",[327,2008,149],{"class":355},[327,2010,2011],{"class":337},"log_errors",[327,2013,149],{"class":355},[327,2015,2016],{"class":337},"id]\n",[327,2018,2019],{"class":329,"line":410},[327,2020,389],{"class":337},[504,2022,2024],{"id":2023},"importing-existing-resources","Importing existing resources",[127,2026,2027],{},"Import resources already created in the UI into Terraform state:",[318,2029,2033],{"className":2030,"code":2031,"language":2032,"meta":323,"style":323},"language-bash shiki shiki-themes github-light","terraform import uptrace_org.main \u003Corg_id>\nterraform import uptrace_project.api \u003Cproject_id>\nterraform import uptrace_project_token.api \u003Cproject_id>:\u003Ctoken_id>\nterraform import uptrace_metric_monitor.error_rate \u003Cproject_id>:\u003Cmonitor_id>\nterraform import uptrace_slack_channel.alerts \u003Cproject_id>:\u003Cchannel_id>\n","bash",[194,2034,2035,2057,2075,2105,2133],{"__ignoreMap":323},[327,2036,2037,2039,2042,2045,2048,2051,2054],{"class":329,"line":330},[327,2038,334],{"class":333},[327,2040,2041],{"class":370}," import",[327,2043,2044],{"class":370}," uptrace_org.main",[327,2046,2047],{"class":355}," \u003C",[327,2049,2050],{"class":370},"org_i",[327,2052,2053],{"class":337},"d",[327,2055,2056],{"class":355},">\n",[327,2058,2059,2061,2063,2066,2068,2071,2073],{"class":329,"line":341},[327,2060,334],{"class":333},[327,2062,2041],{"class":370},[327,2064,2065],{"class":370}," uptrace_project.api",[327,2067,2047],{"class":355},[327,2069,2070],{"class":370},"project_i",[327,2072,2053],{"class":337},[327,2074,2056],{"class":355},[327,2076,2077,2079,2081,2084,2086,2088,2090,2093,2095,2098,2101,2103],{"class":329,"line":349},[327,2078,334],{"class":333},[327,2080,2041],{"class":370},[327,2082,2083],{"class":370}," uptrace_project_token.api",[327,2085,2047],{"class":355},[327,2087,2070],{"class":370},[327,2089,2053],{"class":337},[327,2091,2092],{"class":355},">",[327,2094,1913],{"class":370},[327,2096,2097],{"class":355},"\u003C",[327,2099,2100],{"class":370},"token_i",[327,2102,2053],{"class":337},[327,2104,2056],{"class":355},[327,2106,2107,2109,2111,2114,2116,2118,2120,2122,2124,2126,2129,2131],{"class":329,"line":361},[327,2108,334],{"class":333},[327,2110,2041],{"class":370},[327,2112,2113],{"class":370}," uptrace_metric_monitor.error_rate",[327,2115,2047],{"class":355},[327,2117,2070],{"class":370},[327,2119,2053],{"class":337},[327,2121,2092],{"class":355},[327,2123,1913],{"class":370},[327,2125,2097],{"class":355},[327,2127,2128],{"class":370},"monitor_i",[327,2130,2053],{"class":337},[327,2132,2056],{"class":355},[327,2134,2135,2137,2139,2142,2144,2146,2148,2150,2152,2154,2157,2159],{"class":329,"line":374},[327,2136,334],{"class":333},[327,2138,2041],{"class":370},[327,2140,2141],{"class":370}," uptrace_slack_channel.alerts",[327,2143,2047],{"class":355},[327,2145,2070],{"class":370},[327,2147,2053],{"class":337},[327,2149,2092],{"class":355},[327,2151,1913],{"class":370},[327,2153,2097],{"class":355},[327,2155,2156],{"class":370},"channel_i",[327,2158,2053],{"class":337},[327,2160,2056],{"class":355},[151,2162,65],{"id":2163},"dashboards",[127,2165,2166],{},"Dashboard templates are YAML files. Uptrace activates them automatically when matching metrics arrive. You can export any dashboard as YAML, modify it, and import it across environments via the Uptrace UI.",[318,2168,2172],{"className":2169,"code":2170,"language":2171,"meta":323,"style":323},"language-yaml shiki shiki-themes github-light","schema: v2\nname: 'API Service: Overview'\ntags: [otel, app]\nversion: v26.01.01\n\ntable:\n  metrics:\n    - http_server_request_duration as $dur\n  query:\n    - group by service_name\n    - p99($dur) as p99_ms\n\ngrid_sections:\n  - title: Latency\n    items:\n      - title: p99 latency by service\n        metrics:\n          - http_server_request_duration as $dur\n        query:\n          - p99($dur) group by service_name\n","yaml",[194,2173,2174,2186,2196,2214,2224,2228,2235,2242,2250,2257,2264,2271,2275,2282,2295,2302,2314,2321,2328,2335],{"__ignoreMap":323},[327,2175,2176,2180,2183],{"class":329,"line":330},[327,2177,2179],{"class":2178},"shJU0","schema",[327,2181,2182],{"class":337},": ",[327,2184,2185],{"class":370},"v2\n",[327,2187,2188,2191,2193],{"class":329,"line":341},[327,2189,2190],{"class":2178},"name",[327,2192,2182],{"class":337},[327,2194,2195],{"class":370},"'API Service: Overview'\n",[327,2197,2198,2201,2204,2207,2209,2212],{"class":329,"line":349},[327,2199,2200],{"class":2178},"tags",[327,2202,2203],{"class":337},": [",[327,2205,2206],{"class":370},"otel",[327,2208,741],{"class":337},[327,2210,2211],{"class":370},"app",[327,2213,1725],{"class":337},[327,2215,2216,2219,2221],{"class":329,"line":361},[327,2217,2218],{"class":2178},"version",[327,2220,2182],{"class":337},[327,2222,2223],{"class":370},"v26.01.01\n",[327,2225,2226],{"class":329,"line":374},[327,2227,395],{"emptyLinePlaceholder":10},[327,2229,2230,2232],{"class":329,"line":380},[327,2231,206],{"class":2178},[327,2233,2234],{"class":337},":\n",[327,2236,2237,2240],{"class":329,"line":386},[327,2238,2239],{"class":2178},"  metrics",[327,2241,2234],{"class":337},[327,2243,2244,2247],{"class":329,"line":392},[327,2245,2246],{"class":337},"    - ",[327,2248,2249],{"class":370},"http_server_request_duration as $dur\n",[327,2251,2252,2255],{"class":329,"line":398},[327,2253,2254],{"class":2178},"  query",[327,2256,2234],{"class":337},[327,2258,2259,2261],{"class":329,"line":410},[327,2260,2246],{"class":337},[327,2262,2263],{"class":370},"group by service_name\n",[327,2265,2266,2268],{"class":329,"line":421},[327,2267,2246],{"class":337},[327,2269,2270],{"class":370},"p99($dur) as p99_ms\n",[327,2272,2273],{"class":329,"line":438},[327,2274,395],{"emptyLinePlaceholder":10},[327,2276,2277,2280],{"class":329,"line":443},[327,2278,2279],{"class":2178},"grid_sections",[327,2281,2234],{"class":337},[327,2283,2284,2287,2290,2292],{"class":329,"line":448},[327,2285,2286],{"class":337},"  - ",[327,2288,2289],{"class":2178},"title",[327,2291,2182],{"class":337},[327,2293,2294],{"class":370},"Latency\n",[327,2296,2297,2300],{"class":329,"line":459},[327,2298,2299],{"class":2178},"    items",[327,2301,2234],{"class":337},[327,2303,2304,2307,2309,2311],{"class":329,"line":471},[327,2305,2306],{"class":337},"      - ",[327,2308,2289],{"class":2178},[327,2310,2182],{"class":337},[327,2312,2313],{"class":370},"p99 latency by service\n",[327,2315,2316,2319],{"class":329,"line":482},[327,2317,2318],{"class":2178},"        metrics",[327,2320,2234],{"class":337},[327,2322,2323,2326],{"class":329,"line":678},[327,2324,2325],{"class":337},"          - ",[327,2327,2249],{"class":370},[327,2329,2330,2333],{"class":329,"line":698},[327,2331,2332],{"class":2178},"        query",[327,2334,2234],{"class":337},[327,2336,2337,2339],{"class":329,"line":708},[327,2338,2325],{"class":337},[327,2340,2341],{"class":370},"p99($dur) group by service_name\n",[127,2343,2344,2345,2348],{},"Alert monitors can be bundled directly inside dashboard templates — so dashboards and their alerts ship together as one file. See ",[131,2346,2347],{"href":72},"Dashboard YAML Templates"," for the full schema.",[151,2350,75],{"id":2351},"transformations",[127,2353,2354],{},"Transformation rules are YAML operations applied to every incoming span, log, or metric before storage. Keeping them in files means your data pipeline is auditable and reproducible.",[127,2356,2357],{},"Drop noisy spans before they reach storage:",[318,2359,2361],{"className":2169,"code":2360,"language":2171,"meta":323,"style":323},"name: Drop healthcheck spans\nscope: [spans]\ntype: drop\nif: spanName() == \"GET \u002Fhealthz\" && spanStatusCode() != \"error\"\n",[194,2362,2363,2372,2384,2394],{"__ignoreMap":323},[327,2364,2365,2367,2369],{"class":329,"line":330},[327,2366,2190],{"class":2178},[327,2368,2182],{"class":337},[327,2370,2371],{"class":370},"Drop healthcheck spans\n",[327,2373,2374,2377,2379,2382],{"class":329,"line":341},[327,2375,2376],{"class":2178},"scope",[327,2378,2203],{"class":337},[327,2380,2381],{"class":370},"spans",[327,2383,1725],{"class":337},[327,2385,2386,2389,2391],{"class":329,"line":349},[327,2387,2388],{"class":2178},"type",[327,2390,2182],{"class":337},[327,2392,2393],{"class":370},"drop\n",[327,2395,2396,2399,2401],{"class":329,"line":361},[327,2397,2398],{"class":2178},"if",[327,2400,2182],{"class":337},[327,2402,2403],{"class":370},"spanName() == \"GET \u002Fhealthz\" && spanStatusCode() != \"error\"\n",[127,2405,2406],{},"Sample successful requests while keeping all errors:",[318,2408,2410],{"className":2169,"code":2409,"language":2171,"meta":323,"style":323},"name: Sample 10% of successful requests\nscope: [spans]\ntype: sample\nfraction: 0.1\nif: spanStatusCode() != \"error\"\n",[194,2411,2412,2421,2431,2440,2450],{"__ignoreMap":323},[327,2413,2414,2416,2418],{"class":329,"line":330},[327,2415,2190],{"class":2178},[327,2417,2182],{"class":337},[327,2419,2420],{"class":370},"Sample 10% of successful requests\n",[327,2422,2423,2425,2427,2429],{"class":329,"line":341},[327,2424,2376],{"class":2178},[327,2426,2203],{"class":337},[327,2428,2381],{"class":370},[327,2430,1725],{"class":337},[327,2432,2433,2435,2437],{"class":329,"line":349},[327,2434,2388],{"class":2178},[327,2436,2182],{"class":337},[327,2438,2439],{"class":370},"sample\n",[327,2441,2442,2445,2447],{"class":329,"line":361},[327,2443,2444],{"class":2178},"fraction",[327,2446,2182],{"class":337},[327,2448,2449],{"class":404},"0.1\n",[327,2451,2452,2454,2456],{"class":329,"line":374},[327,2453,2398],{"class":2178},[327,2455,2182],{"class":337},[327,2457,2458],{"class":370},"spanStatusCode() != \"error\"\n",[127,2460,2461,2462,2464],{},"See ",[131,2463,75],{"href":76}," for all available operations.",[151,2466,2468],{"id":2467},"a-complete-workflow","A complete workflow",[127,2470,2471],{},"A typical project layout with Uptrace config in git:",[318,2473,2478],{"className":2474,"code":2476,"language":2477},[2475],"language-text","my-repo\u002F\n└── uptrace\u002F\n    ├── main.tf                # provider + org + projects\n    ├── monitors.tf            # metric and error monitors\n    ├── channels.tf            # notification channels\n    ├── teams.tf               # users, teams, project access\n    ├── variables.tf           # tokens, webhook URLs\n    ├── outputs.tf             # project DSNs\n    ├── dashboards\u002F\n    │   ├── api-service.yml    # dashboard + bundled monitors\n    │   └── worker-service.yml\n    └── transformations\u002F\n        ├── drop-healthchecks.yml\n        └── sample-success.yml\n","text",[194,2479,2476],{"__ignoreMap":323},[127,2481,2482],{},"Applying the config to a new environment:",[2484,2485,2486,2493,2499],"ol",{},[162,2487,2488,2492],{},[165,2489,2490],{},[194,2491,200],{}," — creates orgs, projects, tokens, monitors, channels, and team access",[162,2494,2495,2496],{},"Import dashboard YAML files via ",[165,2497,2498],{},"Metrics → Dashboards → Import",[162,2500,2501,2502],{},"Apply transformation rules via ",[165,2503,2504],{},"Project → Transformations → New Operation → From YAML",[127,2506,2507,2508,149],{},"Step 1 is fully automated and can run in CI\u002FCD pipelines. Dashboards and transformations (steps 2–3) are applied through the UI or via the ",[131,2509,95],{"href":96},[151,2511,2513],{"id":2512},"automating-dashboards-via-mcp","Automating dashboards via MCP",[127,2515,2516,2517,2519],{},"If you use AI assistants (Claude, Cursor, Continue), Uptrace's built-in ",[131,2518,95],{"href":96}," exposes dashboard management as tools — no UI required. You can create, update, and delete dashboards programmatically from your AI assistant using the same YAML format.",[318,2521,2525],{"className":2522,"code":2523,"language":2524,"meta":323,"style":323},"language-sh shiki shiki-themes github-light","claude mcp add --transport http uptrace https:\u002F\u002F\u003Cyour-uptrace-host>\u002Fmcp\u002F\u003Cproject_id> \\\n  --header \"Authorization: Bearer \u003Cyour-user-token>\"\n","sh",[194,2526,2527,2574],{"__ignoreMap":323},[327,2528,2529,2532,2535,2538,2541,2544,2547,2550,2552,2555,2558,2560,2563,2565,2567,2569,2571],{"class":329,"line":330},[327,2530,2531],{"class":333},"claude",[327,2533,2534],{"class":370}," mcp",[327,2536,2537],{"class":370}," add",[327,2539,2540],{"class":404}," --transport",[327,2542,2543],{"class":370}," http",[327,2545,2546],{"class":370}," uptrace",[327,2548,2549],{"class":370}," https:\u002F\u002F",[327,2551,2097],{"class":355},[327,2553,2554],{"class":370},"your-uptrace-hos",[327,2556,2557],{"class":337},"t",[327,2559,2092],{"class":355},[327,2561,2562],{"class":370},"\u002Fmcp\u002F",[327,2564,2097],{"class":355},[327,2566,2070],{"class":370},[327,2568,2053],{"class":337},[327,2570,2092],{"class":355},[327,2572,2573],{"class":404}," \\\n",[327,2575,2576,2579],{"class":329,"line":341},[327,2577,2578],{"class":404},"  --header",[327,2580,2581],{"class":370}," \"Authorization: Bearer \u003Cyour-user-token>\"\n",[127,2583,2584],{},"Once connected, an AI assistant can apply your dashboard YAML files directly:",[206,2586,2587,2597],{},[209,2588,2589],{},[212,2590,2591,2594],{},[215,2592,2593],{},"MCP Tool",[215,2595,2596],{},"What it does",[225,2598,2599,2609,2619,2629],{},[212,2600,2601,2606],{},[230,2602,2603],{},[194,2604,2605],{},"create_dashboard_from_template",[230,2607,2608],{},"Create a new dashboard from YAML",[212,2610,2611,2616],{},[230,2612,2613],{},[194,2614,2615],{},"update_dashboard_from_template",[230,2617,2618],{},"Update an existing dashboard from YAML",[212,2620,2621,2626],{},[230,2622,2623],{},[194,2624,2625],{},"get_dashboard_yaml",[230,2627,2628],{},"Export a dashboard as YAML",[212,2630,2631,2636],{},[230,2632,2633],{},[194,2634,2635],{},"delete_dashboard",[230,2637,2638],{},"Delete a dashboard by ID",[127,2640,2461,2641,2643],{},[131,2642,95],{"href":96}," for setup instructions.",[151,2645,2647],{"id":2646},"self-hosted-seed-data","Self-hosted: seed data",[127,2649,2650,2651,1913],{},"For self-hosted Uptrace, you can also define initial users and projects directly in ",[194,2652,2653],{},"uptrace.yml",[318,2655,2657],{"className":2169,"code":2656,"language":2171,"meta":323,"style":323},"seed_data:\n  orgs:\n    - key: my_org\n      name: My Organization\n  projects:\n    - key: production\n      name: Production\n      org: my_org\n    - key: staging\n      name: Staging\n      org: my_org\n",[194,2658,2659,2666,2673,2685,2695,2702,2713,2722,2731,2742,2751],{"__ignoreMap":323},[327,2660,2661,2664],{"class":329,"line":330},[327,2662,2663],{"class":2178},"seed_data",[327,2665,2234],{"class":337},[327,2667,2668,2671],{"class":329,"line":341},[327,2669,2670],{"class":2178},"  orgs",[327,2672,2234],{"class":337},[327,2674,2675,2677,2680,2682],{"class":329,"line":349},[327,2676,2246],{"class":337},[327,2678,2679],{"class":2178},"key",[327,2681,2182],{"class":337},[327,2683,2684],{"class":370},"my_org\n",[327,2686,2687,2690,2692],{"class":329,"line":361},[327,2688,2689],{"class":2178},"      name",[327,2691,2182],{"class":337},[327,2693,2694],{"class":370},"My Organization\n",[327,2696,2697,2700],{"class":329,"line":374},[327,2698,2699],{"class":2178},"  projects",[327,2701,2234],{"class":337},[327,2703,2704,2706,2708,2710],{"class":329,"line":380},[327,2705,2246],{"class":337},[327,2707,2679],{"class":2178},[327,2709,2182],{"class":337},[327,2711,2712],{"class":370},"production\n",[327,2714,2715,2717,2719],{"class":329,"line":386},[327,2716,2689],{"class":2178},[327,2718,2182],{"class":337},[327,2720,2721],{"class":370},"Production\n",[327,2723,2724,2727,2729],{"class":329,"line":392},[327,2725,2726],{"class":2178},"      org",[327,2728,2182],{"class":337},[327,2730,2684],{"class":370},[327,2732,2733,2735,2737,2739],{"class":329,"line":398},[327,2734,2246],{"class":337},[327,2736,2679],{"class":2178},[327,2738,2182],{"class":337},[327,2740,2741],{"class":370},"staging\n",[327,2743,2744,2746,2748],{"class":329,"line":410},[327,2745,2689],{"class":2178},[327,2747,2182],{"class":337},[327,2749,2750],{"class":370},"Staging\n",[327,2752,2753,2755,2757],{"class":329,"line":421},[327,2754,2726],{"class":2178},[327,2756,2182],{"class":337},[327,2758,2684],{"class":370},[127,2760,2761,2762,2764],{},"The Terraform provider works with both Cloud and self-hosted Uptrace. For self-hosted setups, set the ",[194,2763,497],{}," to your instance URL.",[2766,2767,2768],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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 .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 .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":323,"searchDepth":361,"depth":341,"links":2770},[2771,2772,2773,2780,2781,2782,2783,2784],{"id":153,"depth":341,"text":154},{"id":203,"depth":341,"text":204},{"id":307,"depth":341,"text":308,"children":2774},[2775,2776,2777,2778,2779],{"id":506,"depth":349,"text":507},{"id":828,"depth":349,"text":829},{"id":1145,"depth":349,"text":261},{"id":1658,"depth":349,"text":274},{"id":2023,"depth":349,"text":2024},{"id":2163,"depth":341,"text":65},{"id":2351,"depth":341,"text":75},{"id":2467,"depth":341,"text":2468},{"id":2512,"depth":341,"text":2513},{"id":2646,"depth":341,"text":2647},"Manage Uptrace organizations, projects, monitors, and notification channels with the Uptrace Terraform provider — version-controlled and reproducible across environments.","md",null,{"readingTime":2789},{"text":2790,"minutes":2791,"time":2792,"words":2793},"7 min read",6.01,360600,1202,{"title":99,"description":2785},"1UdgWxS1oTYGI_gWMMg7qlO1TPm0yigJuI1AHOpwo1s",[2797,2799],{"title":95,"path":96,"stem":97,"description":2798,"children":-1},"Built-in Model Context Protocol (MCP) server that lets AI assistants query spans, traces, metrics, alerts, and dashboards in Uptrace.",{"title":108,"path":109,"stem":110,"description":2800,"children":-1},"Configure Google Cloud OpenID Connect SSO with Uptrace using OAuth clients, redirect URIs, and client credentials.",1779957329366]