[{"data":1,"prerenderedAt":1719},["ShallowReactive",2],{"\u002Fget\u002Fhosted\u002Fscale-navigation":3,"\u002Fget\u002Fhosted\u002Fscale":403},[4,8,12,16,20,24,28,68,102,134,162,196,223,261,291,321,348,375],{"title":5,"path":6,"stem":7},"Get started","\u002Fget","get\u002F01.index",{"title":9,"path":10,"stem":11},"Logs monitoring","\u002Fget\u002Flogs","get\u002F02.logs",{"title":13,"path":14,"stem":15},"Exceptions and errors","\u002Fget\u002Fexceptions","get\u002F03.exceptions",{"title":17,"path":18,"stem":19},"Kubernetes","\u002Fget\u002Fkubernetes","get\u002F04.kubernetes",{"title":21,"path":22,"stem":23},"Migrating from Datadog","\u002Fget\u002Fdatadog-migration","get\u002F05.datadog-migration",{"title":25,"path":26,"stem":27},"Migrating from NewRelic","\u002Fget\u002Fnewrelic-migration","get\u002F06.newrelic-migration",{"title":29,"closed":30,"path":31,"stem":32,"children":33,"page":-1},"Hosted",true,"\u002Fget\u002Fhosted","get\u002Fhosted\u002F09.index",[34,36,40,44,48,52,56,60,64],{"title":35,"path":31,"stem":32},"Uptrace Editions",{"title":37,"path":38,"stem":39},"Why Uptrace?","\u002Fget\u002Fhosted\u002Fopen-source-apm","get\u002Fhosted\u002F01.open-source-apm",{"title":41,"path":42,"stem":43},"Install Uptrace","\u002Fget\u002Fhosted\u002Finstall","get\u002Fhosted\u002F02.install",{"title":45,"path":46,"stem":47},"Ansible deployment","\u002Fget\u002Fhosted\u002Fansible","get\u002Fhosted\u002F03.ansible",{"title":49,"path":50,"stem":51},"K8s deployment","\u002Fget\u002Fhosted\u002Fk8s","get\u002Fhosted\u002F04.k8s",{"title":53,"path":54,"stem":55},"Docker deployment","\u002Fget\u002Fhosted\u002Fdocker","get\u002Fhosted\u002F05.docker",{"title":57,"path":58,"stem":59},"Configuration","\u002Fget\u002Fhosted\u002Fconfig","get\u002Fhosted\u002F06.config",{"title":61,"path":62,"stem":63},"Troubleshooting","\u002Fget\u002Fhosted\u002Fdebug","get\u002Fhosted\u002F07.debug",{"title":65,"path":66,"stem":67},"Scaling","\u002Fget\u002Fhosted\u002Fscale","get\u002Fhosted\u002F08.scale",{"title":69,"path":70,"stem":71,"children":72,"closed":30},"C++","\u002Fget\u002Fopentelemetry-cpp","get\u002Fopentelemetry-cpp\u002F01.index",[73,74,78,82,86,90,94,98],{"title":5,"path":70,"stem":71},{"title":75,"path":76,"stem":77},"OTLP exporter","\u002Fget\u002Fopentelemetry-cpp\u002Fotlp","get\u002Fopentelemetry-cpp\u002F02.otlp",{"title":79,"path":80,"stem":81},"Tracing","\u002Fget\u002Fopentelemetry-cpp\u002Ftracing","get\u002Fopentelemetry-cpp\u002F03.tracing",{"title":83,"path":84,"stem":85},"Metrics","\u002Fget\u002Fopentelemetry-cpp\u002Fmetrics","get\u002Fopentelemetry-cpp\u002F04.metrics",{"title":87,"path":88,"stem":89},"Logs","\u002Fget\u002Fopentelemetry-cpp\u002Flogs","get\u002Fopentelemetry-cpp\u002F05.logs",{"title":91,"path":92,"stem":93},"Resource attributes","\u002Fget\u002Fopentelemetry-cpp\u002Fresources","get\u002Fopentelemetry-cpp\u002F06.resources",{"title":95,"path":96,"stem":97},"Context Propagation","\u002Fget\u002Fopentelemetry-cpp\u002Fpropagation","get\u002Fopentelemetry-cpp\u002F07.propagation",{"title":99,"path":100,"stem":101},"Sampling","\u002Fget\u002Fopentelemetry-cpp\u002Fsampling","get\u002Fopentelemetry-cpp\u002F08.sampling",{"title":103,"path":104,"stem":105,"children":106,"closed":30},".NET","\u002Fget\u002Fopentelemetry-dotnet","get\u002Fopentelemetry-dotnet\u002F01.index",[107,108,111,114,117,120,124,127,130],{"title":5,"path":104,"stem":105},{"title":75,"path":109,"stem":110},"\u002Fget\u002Fopentelemetry-dotnet\u002Fotlp","get\u002Fopentelemetry-dotnet\u002F02.otlp",{"title":79,"path":112,"stem":113},"\u002Fget\u002Fopentelemetry-dotnet\u002Ftracing","get\u002Fopentelemetry-dotnet\u002F03.tracing",{"title":83,"path":115,"stem":116},"\u002Fget\u002Fopentelemetry-dotnet\u002Fmetrics","get\u002Fopentelemetry-dotnet\u002F04.metrics",{"title":87,"path":118,"stem":119},"\u002Fget\u002Fopentelemetry-dotnet\u002Flogs","get\u002Fopentelemetry-dotnet\u002F05.logs",{"title":121,"path":122,"stem":123},"Resource detectors","\u002Fget\u002Fopentelemetry-dotnet\u002Fresources","get\u002Fopentelemetry-dotnet\u002F06.resources",{"title":95,"path":125,"stem":126},"\u002Fget\u002Fopentelemetry-dotnet\u002Fpropagation","get\u002Fopentelemetry-dotnet\u002F07.propagation",{"title":99,"path":128,"stem":129},"\u002Fget\u002Fopentelemetry-dotnet\u002Fsampling","get\u002Fopentelemetry-dotnet\u002F08.sampling",{"title":131,"path":132,"stem":133},"Zero-code","\u002Fget\u002Fopentelemetry-dotnet\u002Fzero-code","get\u002Fopentelemetry-dotnet\u002F09.zero-code",{"title":135,"path":136,"stem":137,"children":138,"closed":30},"Erlang\u002FElixir","\u002Fget\u002Fopentelemetry-erlang","get\u002Fopentelemetry-erlang\u002F01.index",[139,140,143,146,149,152,155,159],{"title":5,"path":136,"stem":137},{"title":75,"path":141,"stem":142},"\u002Fget\u002Fopentelemetry-erlang\u002Fotlp","get\u002Fopentelemetry-erlang\u002F02.otlp",{"title":79,"path":144,"stem":145},"\u002Fget\u002Fopentelemetry-erlang\u002Ftracing","get\u002Fopentelemetry-erlang\u002F03.tracing",{"title":83,"path":147,"stem":148},"\u002Fget\u002Fopentelemetry-erlang\u002Fmetrics","get\u002Fopentelemetry-erlang\u002F04.metrics",{"title":87,"path":150,"stem":151},"\u002Fget\u002Fopentelemetry-erlang\u002Flogs","get\u002Fopentelemetry-erlang\u002F05.logs",{"title":121,"path":153,"stem":154},"\u002Fget\u002Fopentelemetry-erlang\u002Fresources","get\u002Fopentelemetry-erlang\u002F06.resources",{"title":156,"path":157,"stem":158},"Propagation","\u002Fget\u002Fopentelemetry-erlang\u002Fpropagation","get\u002Fopentelemetry-erlang\u002F07.propagation",{"title":99,"path":160,"stem":161},"\u002Fget\u002Fopentelemetry-erlang\u002Fsampling","get\u002Fopentelemetry-erlang\u002F08.sampling",{"title":163,"path":164,"stem":165,"children":166,"closed":30},"Golang","\u002Fget\u002Fopentelemetry-go","get\u002Fopentelemetry-go\u002F01.index",[167,168,171,174,177,180,183,186,189,193],{"title":5,"path":164,"stem":165},{"title":75,"path":169,"stem":170},"\u002Fget\u002Fopentelemetry-go\u002Fotlp","get\u002Fopentelemetry-go\u002F02.otlp",{"title":79,"path":172,"stem":173},"\u002Fget\u002Fopentelemetry-go\u002Ftracing","get\u002Fopentelemetry-go\u002F03.tracing",{"title":83,"path":175,"stem":176},"\u002Fget\u002Fopentelemetry-go\u002Fmetrics","get\u002Fopentelemetry-go\u002F04.metrics",{"title":87,"path":178,"stem":179},"\u002Fget\u002Fopentelemetry-go\u002Flogs","get\u002Fopentelemetry-go\u002F05.logs",{"title":121,"path":181,"stem":182},"\u002Fget\u002Fopentelemetry-go\u002Fresources","get\u002Fopentelemetry-go\u002F06.resources",{"title":95,"path":184,"stem":185},"\u002Fget\u002Fopentelemetry-go\u002Fpropagation","get\u002Fopentelemetry-go\u002F07.propagation",{"title":99,"path":187,"stem":188},"\u002Fget\u002Fopentelemetry-go\u002Fsampling","get\u002Fopentelemetry-go\u002F08.sampling",{"title":190,"path":191,"stem":192},"Serverless","\u002Fget\u002Fopentelemetry-go\u002Fserverless","get\u002Fopentelemetry-go\u002F09.serverless",{"title":131,"path":194,"stem":195},"\u002Fget\u002Fopentelemetry-go\u002Fzero-code","get\u002Fopentelemetry-go\u002F09.zero-code",{"title":197,"path":198,"stem":199,"children":200,"closed":30},"Java","\u002Fget\u002Fopentelemetry-java","get\u002Fopentelemetry-java\u002F01.index",[201,202,205,208,211,214,217,220],{"title":5,"path":198,"stem":199},{"title":79,"path":203,"stem":204},"\u002Fget\u002Fopentelemetry-java\u002Ftracing","get\u002Fopentelemetry-java\u002F03.tracing",{"title":83,"path":206,"stem":207},"\u002Fget\u002Fopentelemetry-java\u002Fmetrics","get\u002Fopentelemetry-java\u002F04.metrics",{"title":87,"path":209,"stem":210},"\u002Fget\u002Fopentelemetry-java\u002Flogs","get\u002Fopentelemetry-java\u002F05.logs",{"title":121,"path":212,"stem":213},"\u002Fget\u002Fopentelemetry-java\u002Fresources","get\u002Fopentelemetry-java\u002F06.resources",{"title":156,"path":215,"stem":216},"\u002Fget\u002Fopentelemetry-java\u002Fpropagation","get\u002Fopentelemetry-java\u002F07.propagation",{"title":99,"path":218,"stem":219},"\u002Fget\u002Fopentelemetry-java\u002Fsampling","get\u002Fopentelemetry-java\u002F08.sampling",{"title":131,"path":221,"stem":222},"\u002Fget\u002Fopentelemetry-java\u002Fzero-code","get\u002Fopentelemetry-java\u002F09.zero-code",{"title":224,"path":225,"stem":226,"children":227,"closed":30},"JavaScript","\u002Fget\u002Fopentelemetry-js","get\u002Fopentelemetry-js\u002F01.index",[228,229,233,237,240,243,246,249,252,255,258],{"title":5,"path":225,"stem":226},{"title":230,"path":231,"stem":232},"Node.js","\u002Fget\u002Fopentelemetry-js\u002Fnode","get\u002Fopentelemetry-js\u002F02.node",{"title":234,"path":235,"stem":236},"Browsers","\u002Fget\u002Fopentelemetry-js\u002Fbrowser","get\u002Fopentelemetry-js\u002F03.browser",{"title":75,"path":238,"stem":239},"\u002Fget\u002Fopentelemetry-js\u002Fotlp","get\u002Fopentelemetry-js\u002F04.otlp",{"title":79,"path":241,"stem":242},"\u002Fget\u002Fopentelemetry-js\u002Ftracing","get\u002Fopentelemetry-js\u002F05.tracing",{"title":83,"path":244,"stem":245},"\u002Fget\u002Fopentelemetry-js\u002Fmetrics","get\u002Fopentelemetry-js\u002F06.metrics",{"title":87,"path":247,"stem":248},"\u002Fget\u002Fopentelemetry-js\u002Flogs","get\u002Fopentelemetry-js\u002F07.logs",{"title":121,"path":250,"stem":251},"\u002Fget\u002Fopentelemetry-js\u002Fresources","get\u002Fopentelemetry-js\u002F08.resources",{"title":156,"path":253,"stem":254},"\u002Fget\u002Fopentelemetry-js\u002Fpropagation","get\u002Fopentelemetry-js\u002F09.propagation",{"title":99,"path":256,"stem":257},"\u002Fget\u002Fopentelemetry-js\u002Fsampling","get\u002Fopentelemetry-js\u002F10.sampling",{"title":131,"path":259,"stem":260},"\u002Fget\u002Fopentelemetry-js\u002Fzero-code","get\u002Fopentelemetry-js\u002F11.zero-code",{"title":262,"path":263,"stem":264,"children":265,"closed":30},"PHP","\u002Fget\u002Fopentelemetry-php","get\u002Fopentelemetry-php\u002F01.index",[266,267,270,273,276,279,282,285,288],{"title":5,"path":263,"stem":264},{"title":75,"path":268,"stem":269},"\u002Fget\u002Fopentelemetry-php\u002Fotlp","get\u002Fopentelemetry-php\u002F02.otlp",{"title":79,"path":271,"stem":272},"\u002Fget\u002Fopentelemetry-php\u002Ftracing","get\u002Fopentelemetry-php\u002F03.tracing",{"title":83,"path":274,"stem":275},"\u002Fget\u002Fopentelemetry-php\u002Fmetrics","get\u002Fopentelemetry-php\u002F04.metrics",{"title":87,"path":277,"stem":278},"\u002Fget\u002Fopentelemetry-php\u002Flogs","get\u002Fopentelemetry-php\u002F05.logs",{"title":121,"path":280,"stem":281},"\u002Fget\u002Fopentelemetry-php\u002Fresources","get\u002Fopentelemetry-php\u002F06.resources",{"title":156,"path":283,"stem":284},"\u002Fget\u002Fopentelemetry-php\u002Fpropagation","get\u002Fopentelemetry-php\u002F07.propagation",{"title":99,"path":286,"stem":287},"\u002Fget\u002Fopentelemetry-php\u002Fsampling","get\u002Fopentelemetry-php\u002F08.sampling",{"title":131,"path":289,"stem":290},"\u002Fget\u002Fopentelemetry-php\u002Fzero-code","get\u002Fopentelemetry-php\u002F09.zero-code",{"title":292,"path":293,"stem":294,"children":295,"closed":30},"Python","\u002Fget\u002Fopentelemetry-python","get\u002Fopentelemetry-python\u002F01.index",[296,297,300,303,306,309,312,315,318],{"title":5,"path":293,"stem":294},{"title":75,"path":298,"stem":299},"\u002Fget\u002Fopentelemetry-python\u002Fotlp","get\u002Fopentelemetry-python\u002F02.otlp",{"title":79,"path":301,"stem":302},"\u002Fget\u002Fopentelemetry-python\u002Ftracing","get\u002Fopentelemetry-python\u002F03.tracing",{"title":83,"path":304,"stem":305},"\u002Fget\u002Fopentelemetry-python\u002Fmetrics","get\u002Fopentelemetry-python\u002F04.metrics",{"title":87,"path":307,"stem":308},"\u002Fget\u002Fopentelemetry-python\u002Flogs","get\u002Fopentelemetry-python\u002F05.logs",{"title":121,"path":310,"stem":311},"\u002Fget\u002Fopentelemetry-python\u002Fresources","get\u002Fopentelemetry-python\u002F06.resources",{"title":156,"path":313,"stem":314},"\u002Fget\u002Fopentelemetry-python\u002Fpropagation","get\u002Fopentelemetry-python\u002F07.propagation",{"title":99,"path":316,"stem":317},"\u002Fget\u002Fopentelemetry-python\u002Fsampling","get\u002Fopentelemetry-python\u002F08.sampling",{"title":131,"path":319,"stem":320},"\u002Fget\u002Fopentelemetry-python\u002Fzero-code","get\u002Fopentelemetry-python\u002F09.zero-code",{"title":322,"path":323,"stem":324,"children":325,"closed":30},"Ruby","\u002Fget\u002Fopentelemetry-ruby","get\u002Fopentelemetry-ruby\u002F01.index",[326,327,330,333,336,339,342,345],{"title":5,"path":323,"stem":324},{"title":75,"path":328,"stem":329},"\u002Fget\u002Fopentelemetry-ruby\u002Fotlp","get\u002Fopentelemetry-ruby\u002F02.otlp",{"title":79,"path":331,"stem":332},"\u002Fget\u002Fopentelemetry-ruby\u002Ftracing","get\u002Fopentelemetry-ruby\u002F03.tracing",{"title":83,"path":334,"stem":335},"\u002Fget\u002Fopentelemetry-ruby\u002Fmetrics","get\u002Fopentelemetry-ruby\u002F04.metrics",{"title":87,"path":337,"stem":338},"\u002Fget\u002Fopentelemetry-ruby\u002Flogs","get\u002Fopentelemetry-ruby\u002F05.logs",{"title":121,"path":340,"stem":341},"\u002Fget\u002Fopentelemetry-ruby\u002Fresources","get\u002Fopentelemetry-ruby\u002F06.resources",{"title":156,"path":343,"stem":344},"\u002Fget\u002Fopentelemetry-ruby\u002Fpropagation","get\u002Fopentelemetry-ruby\u002F07.propagation",{"title":99,"path":346,"stem":347},"\u002Fget\u002Fopentelemetry-ruby\u002Fsampling","get\u002Fopentelemetry-ruby\u002F08.sampling",{"title":349,"path":350,"stem":351,"children":352,"closed":30},"Rust","\u002Fget\u002Fopentelemetry-rust","get\u002Fopentelemetry-rust\u002F01.index",[353,354,357,360,363,366,369,372],{"title":5,"path":350,"stem":351},{"title":75,"path":355,"stem":356},"\u002Fget\u002Fopentelemetry-rust\u002Fotlp","get\u002Fopentelemetry-rust\u002F02.otlp",{"title":79,"path":358,"stem":359},"\u002Fget\u002Fopentelemetry-rust\u002Ftracing","get\u002Fopentelemetry-rust\u002F03.tracing",{"title":83,"path":361,"stem":362},"\u002Fget\u002Fopentelemetry-rust\u002Fmetrics","get\u002Fopentelemetry-rust\u002F04.metrics",{"title":87,"path":364,"stem":365},"\u002Fget\u002Fopentelemetry-rust\u002Flogs","get\u002Fopentelemetry-rust\u002F05.logs",{"title":121,"path":367,"stem":368},"\u002Fget\u002Fopentelemetry-rust\u002Fresources","get\u002Fopentelemetry-rust\u002F06.resources",{"title":156,"path":370,"stem":371},"\u002Fget\u002Fopentelemetry-rust\u002Fpropagation","get\u002Fopentelemetry-rust\u002F07.propagation",{"title":99,"path":373,"stem":374},"\u002Fget\u002Fopentelemetry-rust\u002Fsampling","get\u002Fopentelemetry-rust\u002F08.sampling",{"title":376,"path":377,"stem":378,"children":379,"closed":30},"Swift","\u002Fget\u002Fopentelemetry-swift","get\u002Fopentelemetry-swift\u002F01.index",[380,381,384,387,390,393,397,400],{"title":5,"path":377,"stem":378},{"title":75,"path":382,"stem":383},"\u002Fget\u002Fopentelemetry-swift\u002Fotlp","get\u002Fopentelemetry-swift\u002F02.otlp",{"title":79,"path":385,"stem":386},"\u002Fget\u002Fopentelemetry-swift\u002Ftracing","get\u002Fopentelemetry-swift\u002F03.tracing",{"title":83,"path":388,"stem":389},"\u002Fget\u002Fopentelemetry-swift\u002Fmetrics","get\u002Fopentelemetry-swift\u002F04.metrics",{"title":87,"path":391,"stem":392},"\u002Fget\u002Fopentelemetry-swift\u002Flogs","get\u002Fopentelemetry-swift\u002F05.logs",{"title":394,"path":395,"stem":396},"Resource Attributes","\u002Fget\u002Fopentelemetry-swift\u002Fresources","get\u002Fopentelemetry-swift\u002F06.resources",{"title":95,"path":398,"stem":399},"\u002Fget\u002Fopentelemetry-swift\u002Fpropagation","get\u002Fopentelemetry-swift\u002F07.propagation",{"title":99,"path":401,"stem":402},"\u002Fget\u002Fopentelemetry-swift\u002Fsampling","get\u002Fopentelemetry-swift\u002F08.sampling",{"page":404,"surround":1714},{"id":405,"title":406,"body":407,"description":1701,"extension":1702,"image":1703,"meta":1704,"navigation":1710,"path":66,"seo":1711,"stem":67,"surround_disabled":1712,"__hash__":1713},"get\u002Fget\u002Fhosted\u002F08.scale.md","Scaling Uptrace",{"type":408,"value":409,"toc":1677},"minimark",[410,414,466,478,483,488,498,504,508,511,515,594,598,601,672,675,678,739,741,747,753,788,794,796,802,807,832,835,837,842,863,866,900,903,907,913,1134,1143,1147,1158,1246,1260,1262,1269,1271,1274,1292,1294,1297,1306,1308,1313,1328,1331,1338,1341,1511,1524,1537,1540,1544,1551,1554,1568,1571,1575,1599,1670,1673],[411,412,413],"p",{},"This guide covers how to scale Uptrace for higher ingestion volumes. Work through these steps in order:",[415,416,417,427,434,442,450,458],"ol",{},[418,419,420,421,426],"li",{},"Review ",[422,423,425],"a",{"href":424},"#scaling-strategy","scaling strategy"," — vertical first, then horizontal.",[418,428,429,433],{},[422,430,432],{"href":431},"#diagnosing-bottlenecks","Diagnose the bottleneck"," — buffer-full errors, part counts, CPU.",[418,435,436,437,441],{},"Tune ",[422,438,440],{"href":439},"#uptrace-processing-pipelines","Uptrace processing pipelines"," — more threads and larger buffers.",[418,443,444,445,449],{},"Optimize ",[422,446,448],{"href":447},"#clickhouse-insert-tuning","ClickHouse inserts"," — async inserts and batching.",[418,451,452,453,457],{},"Add ",[422,454,456],{"href":455},"#clickhouse-sharding","ClickHouse sharding"," — when a single node isn't enough.",[418,459,460,461,465],{},"Consider ",[422,462,464],{"href":463},"#kafka","Kafka"," — only after exhausting the other options.",[411,467,468,469,472,473,477],{},"For the full list of configuration options, see the ",[422,470,471],{"href":58},"configuration reference",". Most changes require an Uptrace restart — see ",[422,474,476],{"href":475},"\u002Fget\u002Fhosted\u002Finstall#upgrading-uptrace","upgrading Uptrace"," for the procedure.",[479,480,482],"h2",{"id":481},"scaling-strategy","Scaling strategy",[484,485,487],"h3",{"id":486},"vertical-first","Vertical first",[411,489,490,491,497],{},"According to ",[422,492,496],{"href":493,"rel":494},"https:\u002F\u002Fclickhouse.com\u002Fblog\u002Fcommon-getting-started-issues-with-clickhouse#2-going-horizontal-too-early",[495],"nofollow","ClickHouse documentation",", prefer vertical scaling over horizontal scaling:",[499,500,501],"blockquote",{},[411,502,503],{},"Successful deployments with ClickHouse use servers with hundreds of cores, terabytes of RAM, and petabytes of disk space. Scaling vertically first provides cost efficiency, lower operational overhead, and better query performance.",[484,505,507],{"id":506},"horizontal-scaling","Horizontal scaling",[411,509,510],{},"Uptrace instances are stateless and can be scaled horizontally. Use a load balancer to distribute traffic across instances — each instance should connect to the same PostgreSQL and ClickHouse databases.",[484,512,514],{"id":513},"resource-requirements","Resource requirements",[516,517,518,537],"table",{},[519,520,521],"thead",{},[522,523,524,528,531,534],"tr",{},[525,526,527],"th",{},"Component",[525,529,530],{},"CPU",[525,532,533],{},"RAM",[525,535,536],{},"Notes",[538,539,540,555,567,580],"tbody",{},[522,541,542,546,549,552],{},[543,544,545],"td",{},"Uptrace instance",[543,547,548],{},"2–4",[543,550,551],{},"4–8 GB",[543,553,554],{},"Per instance behind load balancer",[522,556,557,560,562,564],{},[543,558,559],{},"PostgreSQL",[543,561,548],{},[543,563,551],{},[543,565,566],{},"SSD storage recommended",[522,568,569,572,575,577],{},[543,570,571],{},"ClickHouse",[543,573,574],{},"Scale",[543,576,574],{},[543,578,579],{},"Prefer large instances over many small",[522,581,582,585,588,591],{},[543,583,584],{},"Redis",[543,586,587],{},"1–2",[543,589,590],{},"2–4 GB",[543,592,593],{},"For caching and session storage",[479,595,597],{"id":596},"diagnosing-bottlenecks","Diagnosing bottlenecks",[411,599,600],{},"Before changing configuration, identify the actual bottleneck:",[602,603,604,619,633,642,662],"ul",{},[418,605,606,614,615,618],{},[607,608,609,613],"strong",{},[610,611,612],"code",{},"in-memory buffer is full"," in Uptrace logs"," — ingestion is outpacing ClickHouse inserts. Increase ",[610,616,617],{},"max_buffered_bytes"," or add more processing threads.",[418,620,621,624,625,628,629,632],{},[607,622,623],{},"High active part count"," (",[610,626,627],{},"system.parts"," table) — too many small inserts are creating parts faster than merges can consolidate them. Enable async inserts or increase ",[610,630,631],{},"ch_max_insert_size",".",[418,634,635,624,638,641],{},[607,636,637],{},"High merge activity",[610,639,640],{},"system.merges"," table) — related to high part count. Larger, less frequent inserts reduce merge pressure.",[418,643,644,647,648,654,655,661],{},[607,645,646],{},"Insert latency"," — slow inserts cause buffers to fill up. Check ClickHouse disk I\u002FO and CPU. SSDs are strongly recommended. Also ensure ",[422,649,651],{"href":650},"#async_insert",[610,652,653],{},"async_insert"," is enabled and ",[422,656,658],{"href":657},"#wait_for_async_insert",[610,659,660],{},"wait_for_async_insert"," is set appropriately — synchronous inserts add a flush round-trip to every batch.",[418,663,664,667,668,671],{},[607,665,666],{},"CPU saturation on the Uptrace host"," — if all cores are busy, adding more ",[610,669,670],{},"max_threads"," won't help. Consider moving ClickHouse to a separate server or adding shards.",[479,673,440],{"id":674},"uptrace-processing-pipelines",[411,676,677],{},"Uptrace processes telemetry through parallel pipelines — one each for spans, span links, logs, events, and metrics. Each pipeline has three settings:",[516,679,680,693],{},[519,681,682],{},[522,683,684,687,690],{},[525,685,686],{},"Setting",[525,688,689],{},"What it controls",[525,691,692],{},"Default",[538,694,695,710,724],{},[522,696,697,701,704],{},[543,698,699],{},[610,700,670],{},[543,702,703],{},"Processing goroutines",[543,705,706,709],{},[610,707,708],{},"GOMAXPROCS"," (CPU cores)",[522,711,712,716,719],{},[543,713,714],{},[610,715,617],{},[543,717,718],{},"In-memory buffer cap",[543,720,721],{},[610,722,723],{},"max_threads × 64 MiB",[522,725,726,730,733],{},[543,727,728],{},[610,729,631],{},[543,731,732],{},"Records per INSERT batch",[543,734,735,738],{},[610,736,737],{},"10000"," (varies by pipeline)",[484,740,670],{"id":670},[411,742,743,744,632],{},"The number of goroutines that process records and insert them into ClickHouse. Each thread pulls a batch from the in-memory buffer, processes it, and executes a ClickHouse ",[610,745,746],{},"INSERT",[411,748,749,750,752],{},"Default: ",[610,751,708],{}," (CPU cores). Increase when CPU is not the bottleneck but insert latency is — for example, when ClickHouse is on a separate server and network round-trips dominate.",[754,755,760],"pre",{"className":756,"code":757,"language":758,"meta":759,"style":759},"language-yml shiki shiki-themes github-light","spans:\n  max_threads: 16\n","yml","",[610,761,762,775],{"__ignoreMap":759},[763,764,767,771],"span",{"class":765,"line":766},"line",1,[763,768,770],{"class":769},"shJU0","spans",[763,772,774],{"class":773},"sgsFI",":\n",[763,776,778,781,784],{"class":765,"line":777},2,[763,779,780],{"class":769},"  max_threads",[763,782,783],{"class":773},": ",[763,785,787],{"class":786},"sYu0t","16\n",[411,789,790,791,793],{},"Setting ",[610,792,670],{}," higher than the number of CPU cores is safe — the threads spend most of their time waiting on ClickHouse I\u002FO.",[484,795,617],{"id":617},[411,797,798,799,801],{},"Caps the total estimated bytes held in memory for a pipeline. When the buffer is full, incoming records are dropped and an ",[610,800,612],{}," error is logged.",[411,803,749,804,806],{},[610,805,723],{},". With 16 threads the default buffer is 1 GiB.",[754,808,810],{"className":756,"code":809,"language":758,"meta":759,"style":759},"spans:\n  max_buffered_bytes: 536870912 # 512 MiB\n",[610,811,812,818],{"__ignoreMap":759},[763,813,814,816],{"class":765,"line":766},[763,815,770],{"class":769},[763,817,774],{"class":773},[763,819,820,823,825,828],{"class":765,"line":777},[763,821,822],{"class":769},"  max_buffered_bytes",[763,824,783],{"class":773},[763,826,827],{"class":786},"536870912",[763,829,831],{"class":830},"sAwPA"," # 512 MiB\n",[411,833,834],{},"If you see buffer-full errors, ingestion is temporarily outpacing ClickHouse insert speed. Increase the value to absorb bursts without dropping data. As a rough guide, size the buffer for the longest realistic ClickHouse stall (a merge, a brief network hiccup, etc.).",[484,836,631],{"id":631},[411,838,839,840,632],{},"The maximum number of records batched into a single ClickHouse ",[610,841,746],{},[754,843,845],{"className":756,"code":844,"language":758,"meta":759,"style":759},"spans:\n  ch_max_insert_size: 10000\n",[610,846,847,853],{"__ignoreMap":759},[763,848,849,851],{"class":765,"line":766},[763,850,770],{"class":769},[763,852,774],{"class":773},[763,854,855,858,860],{"class":765,"line":777},[763,856,857],{"class":769},"  ch_max_insert_size",[763,859,783],{"class":773},[763,861,862],{"class":786},"10000\n",[411,864,865],{},"The right value depends on whether ClickHouse async inserts are enabled:",[602,867,868,886],{},[418,869,870,876,877,624,879,882,883,885],{},[607,871,872,875],{},[610,873,874],{},"async_insert = 1"," (recommended)."," ClickHouse accumulates inserts into its own buffer and flushes them as larger batches. You can use a smaller ",[610,878,631],{},[610,880,881],{},"5000","–",[610,884,737],{},") — smaller Uptrace batches flush faster and reduce buffer pressure, while ClickHouse still creates efficiently sized data parts.",[418,887,888,893,894,882,896,899],{},[607,889,890,632],{},[610,891,892],{},"async_insert = 0"," Each Uptrace insert creates a separate data part. Larger values (",[610,895,737],{},[610,897,898],{},"20000",") are important to avoid too many small parts, which increases merge pressure and degrades query performance.",[411,901,902],{},"In both cases, very large batches increase per-insert latency and memory usage. Reduce the value if inserts are timing out.",[484,904,906],{"id":905},"example-high-volume-configuration","Example: high-volume configuration",[411,908,909,910,912],{},"The values below assume ",[610,911,874],{}," and use more threads and larger buffers than the defaults. The combined buffer totals roughly 2.6 GiB — make sure the host has enough RAM, especially if Uptrace and ClickHouse share the same server.",[754,914,916],{"className":756,"code":915,"language":758,"meta":759,"style":759},"spans:\n  max_threads: 16\n  ch_max_insert_size: 10000\n  max_buffered_bytes: 1073741824 # 1 GiB\n\nspan_links:\n  max_threads: 2\n  ch_max_insert_size: 5000\n  max_buffered_bytes: 134217728 # 128 MiB\n\nlogs:\n  max_threads: 12\n  ch_max_insert_size: 10000\n  max_buffered_bytes: 805306368 # 768 MiB\n\nevents:\n  max_threads: 4\n  ch_max_insert_size: 5000\n  max_buffered_bytes: 268435456 # 256 MiB\n\nmetrics:\n  max_threads: 8\n  ch_max_insert_size: 10000\n  max_buffered_bytes: 536870912 # 512 MiB\n",[610,917,918,924,932,941,954,960,968,978,988,1001,1006,1014,1024,1033,1046,1051,1059,1069,1078,1091,1096,1104,1114,1123],{"__ignoreMap":759},[763,919,920,922],{"class":765,"line":766},[763,921,770],{"class":769},[763,923,774],{"class":773},[763,925,926,928,930],{"class":765,"line":777},[763,927,780],{"class":769},[763,929,783],{"class":773},[763,931,787],{"class":786},[763,933,935,937,939],{"class":765,"line":934},3,[763,936,857],{"class":769},[763,938,783],{"class":773},[763,940,862],{"class":786},[763,942,944,946,948,951],{"class":765,"line":943},4,[763,945,822],{"class":769},[763,947,783],{"class":773},[763,949,950],{"class":786},"1073741824",[763,952,953],{"class":830}," # 1 GiB\n",[763,955,957],{"class":765,"line":956},5,[763,958,959],{"emptyLinePlaceholder":30},"\n",[763,961,963,966],{"class":765,"line":962},6,[763,964,965],{"class":769},"span_links",[763,967,774],{"class":773},[763,969,971,973,975],{"class":765,"line":970},7,[763,972,780],{"class":769},[763,974,783],{"class":773},[763,976,977],{"class":786},"2\n",[763,979,981,983,985],{"class":765,"line":980},8,[763,982,857],{"class":769},[763,984,783],{"class":773},[763,986,987],{"class":786},"5000\n",[763,989,991,993,995,998],{"class":765,"line":990},9,[763,992,822],{"class":769},[763,994,783],{"class":773},[763,996,997],{"class":786},"134217728",[763,999,1000],{"class":830}," # 128 MiB\n",[763,1002,1004],{"class":765,"line":1003},10,[763,1005,959],{"emptyLinePlaceholder":30},[763,1007,1009,1012],{"class":765,"line":1008},11,[763,1010,1011],{"class":769},"logs",[763,1013,774],{"class":773},[763,1015,1017,1019,1021],{"class":765,"line":1016},12,[763,1018,780],{"class":769},[763,1020,783],{"class":773},[763,1022,1023],{"class":786},"12\n",[763,1025,1027,1029,1031],{"class":765,"line":1026},13,[763,1028,857],{"class":769},[763,1030,783],{"class":773},[763,1032,862],{"class":786},[763,1034,1036,1038,1040,1043],{"class":765,"line":1035},14,[763,1037,822],{"class":769},[763,1039,783],{"class":773},[763,1041,1042],{"class":786},"805306368",[763,1044,1045],{"class":830}," # 768 MiB\n",[763,1047,1049],{"class":765,"line":1048},15,[763,1050,959],{"emptyLinePlaceholder":30},[763,1052,1054,1057],{"class":765,"line":1053},16,[763,1055,1056],{"class":769},"events",[763,1058,774],{"class":773},[763,1060,1062,1064,1066],{"class":765,"line":1061},17,[763,1063,780],{"class":769},[763,1065,783],{"class":773},[763,1067,1068],{"class":786},"4\n",[763,1070,1072,1074,1076],{"class":765,"line":1071},18,[763,1073,857],{"class":769},[763,1075,783],{"class":773},[763,1077,987],{"class":786},[763,1079,1081,1083,1085,1088],{"class":765,"line":1080},19,[763,1082,822],{"class":769},[763,1084,783],{"class":773},[763,1086,1087],{"class":786},"268435456",[763,1089,1090],{"class":830}," # 256 MiB\n",[763,1092,1094],{"class":765,"line":1093},20,[763,1095,959],{"emptyLinePlaceholder":30},[763,1097,1099,1102],{"class":765,"line":1098},21,[763,1100,1101],{"class":769},"metrics",[763,1103,774],{"class":773},[763,1105,1107,1109,1111],{"class":765,"line":1106},22,[763,1108,780],{"class":769},[763,1110,783],{"class":773},[763,1112,1113],{"class":786},"8\n",[763,1115,1117,1119,1121],{"class":765,"line":1116},23,[763,1118,857],{"class":769},[763,1120,783],{"class":773},[763,1122,862],{"class":786},[763,1124,1126,1128,1130,1132],{"class":765,"line":1125},24,[763,1127,822],{"class":769},[763,1129,783],{"class":773},[763,1131,827],{"class":786},[763,1133,831],{"class":830},[411,1135,1136,1137,1139,1140,1142],{},"If you see ",[610,1138,612],{}," errors, increase ",[610,1141,617],{}," for the affected pipeline and add more RAM to the host.",[479,1144,1146],{"id":1145},"clickhouse-insert-tuning","ClickHouse insert tuning",[411,1148,1149,1150,1153,1154,1157],{},"The settings below are ClickHouse server settings. You can set them globally in ClickHouse (",[610,1151,1152],{},"users.xml"," or ",[610,1155,1156],{},"profiles.xml",") or pass them per-query through the Uptrace config:",[754,1159,1161],{"className":756,"code":1160,"language":758,"meta":759,"style":759},"ch_cluster:\n  shards:\n    - replicas:\n        - addr: localhost:9000\n          query_settings:\n            async_insert: 1\n            wait_for_async_insert: 1\n            async_insert_max_data_size: 200000000\n            async_insert_busy_timeout_ms: 5000\n",[610,1162,1163,1170,1177,1187,1201,1208,1218,1227,1237],{"__ignoreMap":759},[763,1164,1165,1168],{"class":765,"line":766},[763,1166,1167],{"class":769},"ch_cluster",[763,1169,774],{"class":773},[763,1171,1172,1175],{"class":765,"line":777},[763,1173,1174],{"class":769},"  shards",[763,1176,774],{"class":773},[763,1178,1179,1182,1185],{"class":765,"line":934},[763,1180,1181],{"class":773},"    - ",[763,1183,1184],{"class":769},"replicas",[763,1186,774],{"class":773},[763,1188,1189,1192,1195,1197],{"class":765,"line":943},[763,1190,1191],{"class":773},"        - ",[763,1193,1194],{"class":769},"addr",[763,1196,783],{"class":773},[763,1198,1200],{"class":1199},"sYBdl","localhost:9000\n",[763,1202,1203,1206],{"class":765,"line":956},[763,1204,1205],{"class":769},"          query_settings",[763,1207,774],{"class":773},[763,1209,1210,1213,1215],{"class":765,"line":962},[763,1211,1212],{"class":769},"            async_insert",[763,1214,783],{"class":773},[763,1216,1217],{"class":786},"1\n",[763,1219,1220,1223,1225],{"class":765,"line":970},[763,1221,1222],{"class":769},"            wait_for_async_insert",[763,1224,783],{"class":773},[763,1226,1217],{"class":786},[763,1228,1229,1232,1234],{"class":765,"line":980},[763,1230,1231],{"class":769},"            async_insert_max_data_size",[763,1233,783],{"class":773},[763,1235,1236],{"class":786},"200000000\n",[763,1238,1239,1242,1244],{"class":765,"line":990},[763,1240,1241],{"class":769},"            async_insert_busy_timeout_ms",[763,1243,783],{"class":773},[763,1245,987],{"class":786},[411,1247,1248,1249,1252,1253,1153,1256,1259],{},"The async insert buffer flushes when ",[607,1250,1251],{},"either"," ",[610,1254,1255],{},"async_insert_max_data_size",[610,1257,1258],{},"async_insert_busy_timeout_ms"," is reached — whichever comes first.",[484,1261,653],{"id":653},[411,1263,1264,1265,1268],{},"When enabled (",[610,1266,1267],{},"1",", recommended), ClickHouse buffers incoming inserts and flushes them as a single batch instead of writing each insert immediately. This reduces the number of data parts created, lowering merge pressure and improving throughput.",[484,1270,660],{"id":660},[411,1272,1273],{},"Controls whether ClickHouse acknowledges an insert immediately or waits until the buffer is flushed to disk.",[602,1275,1276,1284],{},[418,1277,1278,1283],{},[607,1279,1280,632],{},[610,1281,1282],{},"wait_for_async_insert: 1"," Uptrace waits for the flush to complete. Acknowledged data is guaranteed to be persisted, and insert errors are reported back to Uptrace.",[418,1285,1286,1291],{},[607,1287,1288,632],{},[610,1289,1290],{},"wait_for_async_insert: 0"," The insert returns as soon as data enters the buffer. Faster, but a ClickHouse crash can lose buffered data, and insert errors are silently ignored.",[484,1293,1255],{"id":1255},[411,1295,1296],{},"Maximum bytes in the async insert buffer before a flush is triggered.",[411,1298,749,1299,1302,1303,1305],{},[610,1300,1301],{},"100 MiB",". Since Uptrace already batches on the client side via ",[610,1304,631],{},", the async buffer is merging a few concurrent batches rather than thousands of tiny inserts. For high-volume deployments, increase to 200–500 MB to create fewer, larger data parts at the cost of more memory on the ClickHouse side.",[484,1307,1258],{"id":1258},[411,1309,1310,1311,632],{},"Maximum time (ms) before the async buffer is flushed, even if it hasn't reached ",[610,1312,1255],{},[411,1314,749,1315,1318,1319,882,1322,1324,1325,1327],{},[610,1316,1317],{},"1000"," ms. Increase to ",[610,1320,1321],{},"3000",[610,1323,881],{}," ms to give the buffer more time to fill, resulting in fewer and larger data parts. Lower values reduce the data-loss window when ",[610,1326,1290],{},", but create more parts. High-volume deployments generally benefit from longer timeouts.",[479,1329,456],{"id":1330},"clickhouse-sharding",[411,1332,1333,1334,1337],{},"For ingestion volumes that exceed a single ClickHouse node, distribute data across multiple shards. Sharding is a ",[607,1335,1336],{},"Premium"," feature.",[411,1339,1340],{},"Each shard is an independent ClickHouse node (or replicated set) that stores a portion of the data. Uptrace distributes writes using weighted round-robin.",[754,1342,1344],{"className":756,"code":1343,"language":758,"meta":759,"style":759},"ch_cluster:\n  cluster: 'uptrace1'\n  replicated: true\n  distributed: true # Required for sharding (Premium only)\n\n  shards:\n    - weight: 1\n      replicas:\n        - addr: clickhouse-1a:9000\n          database: uptrace\n        - addr: clickhouse-1b:9000\n          database: uptrace\n\n    - weight: 1\n      replicas:\n        - addr: clickhouse-2a:9000\n          database: uptrace\n        - addr: clickhouse-2b:9000\n          database: uptrace\n",[610,1345,1346,1352,1362,1372,1385,1389,1395,1406,1413,1424,1434,1445,1453,1457,1467,1473,1484,1492,1503],{"__ignoreMap":759},[763,1347,1348,1350],{"class":765,"line":766},[763,1349,1167],{"class":769},[763,1351,774],{"class":773},[763,1353,1354,1357,1359],{"class":765,"line":777},[763,1355,1356],{"class":769},"  cluster",[763,1358,783],{"class":773},[763,1360,1361],{"class":1199},"'uptrace1'\n",[763,1363,1364,1367,1369],{"class":765,"line":934},[763,1365,1366],{"class":769},"  replicated",[763,1368,783],{"class":773},[763,1370,1371],{"class":786},"true\n",[763,1373,1374,1377,1379,1382],{"class":765,"line":943},[763,1375,1376],{"class":769},"  distributed",[763,1378,783],{"class":773},[763,1380,1381],{"class":786},"true",[763,1383,1384],{"class":830}," # Required for sharding (Premium only)\n",[763,1386,1387],{"class":765,"line":956},[763,1388,959],{"emptyLinePlaceholder":30},[763,1390,1391,1393],{"class":765,"line":962},[763,1392,1174],{"class":769},[763,1394,774],{"class":773},[763,1396,1397,1399,1402,1404],{"class":765,"line":970},[763,1398,1181],{"class":773},[763,1400,1401],{"class":769},"weight",[763,1403,783],{"class":773},[763,1405,1217],{"class":786},[763,1407,1408,1411],{"class":765,"line":980},[763,1409,1410],{"class":769},"      replicas",[763,1412,774],{"class":773},[763,1414,1415,1417,1419,1421],{"class":765,"line":990},[763,1416,1191],{"class":773},[763,1418,1194],{"class":769},[763,1420,783],{"class":773},[763,1422,1423],{"class":1199},"clickhouse-1a:9000\n",[763,1425,1426,1429,1431],{"class":765,"line":1003},[763,1427,1428],{"class":769},"          database",[763,1430,783],{"class":773},[763,1432,1433],{"class":1199},"uptrace\n",[763,1435,1436,1438,1440,1442],{"class":765,"line":1008},[763,1437,1191],{"class":773},[763,1439,1194],{"class":769},[763,1441,783],{"class":773},[763,1443,1444],{"class":1199},"clickhouse-1b:9000\n",[763,1446,1447,1449,1451],{"class":765,"line":1016},[763,1448,1428],{"class":769},[763,1450,783],{"class":773},[763,1452,1433],{"class":1199},[763,1454,1455],{"class":765,"line":1026},[763,1456,959],{"emptyLinePlaceholder":30},[763,1458,1459,1461,1463,1465],{"class":765,"line":1035},[763,1460,1181],{"class":773},[763,1462,1401],{"class":769},[763,1464,783],{"class":773},[763,1466,1217],{"class":786},[763,1468,1469,1471],{"class":765,"line":1048},[763,1470,1410],{"class":769},[763,1472,774],{"class":773},[763,1474,1475,1477,1479,1481],{"class":765,"line":1053},[763,1476,1191],{"class":773},[763,1478,1194],{"class":769},[763,1480,783],{"class":773},[763,1482,1483],{"class":1199},"clickhouse-2a:9000\n",[763,1485,1486,1488,1490],{"class":765,"line":1061},[763,1487,1428],{"class":769},[763,1489,783],{"class":773},[763,1491,1433],{"class":1199},[763,1493,1494,1496,1498,1500],{"class":765,"line":1071},[763,1495,1191],{"class":773},[763,1497,1194],{"class":769},[763,1499,783],{"class":773},[763,1501,1502],{"class":1199},"clickhouse-2b:9000\n",[763,1504,1505,1507,1509],{"class":765,"line":1080},[763,1506,1428],{"class":769},[763,1508,783],{"class":773},[763,1510,1433],{"class":1199},[411,1512,1513,1514,1516,1517,1520,1521,1523],{},"The ",[610,1515,1401],{}," parameter controls write distribution — a shard with weight ",[610,1518,1519],{},"2"," receives twice as many writes as weight ",[610,1522,1267],{},". Use this when shards have different hardware capacity.",[411,1525,1526,1527,1530,1531,1536],{},"This configuration tells Uptrace which shards exist. You also need to configure the ClickHouse cluster itself — define the topology in ClickHouse's ",[610,1528,1529],{},"remote_servers"," so that ClickHouse knows about all shards and replicas. See the ",[422,1532,1535],{"href":1533,"rel":1534},"https:\u002F\u002Fclickhouse.com\u002Fdocs\u002Farchitecture\u002Fcluster-deployment",[495],"ClickHouse cluster deployment docs"," for details.",[411,1538,1539],{},"When adding shards to an existing deployment, you don't need to redistribute old data. New writes go to the new shards, and queries automatically span all shards via distributed tables.",[479,1541,1543],{"id":1542},"kafka","Kafka-based ingestion",[411,1545,1546,1547,1550],{},"Kafka integration is available in the ",[607,1548,1549],{},"Enterprise tier"," only.",[411,1552,1553],{},"Kafka solves two problems:",[415,1555,1556,1562],{},[418,1557,1558,1561],{},[607,1559,1560],{},"Buffering during maintenance."," When ClickHouse is down or can't keep up, Kafka retains data until ClickHouse is ready. Without Kafka, data arriving during these windows is dropped.",[418,1563,1564,1567],{},[607,1565,1566],{},"Efficient batching."," Kafka enables larger, more efficient batches before writing to ClickHouse, improving insert throughput.",[411,1569,1570],{},"That said, Kafka adds operational complexity — evaluate whether the buffering benefits justify the additional infrastructure. Consider it only after exhausting the tuning options above.",[484,1572,1574],{"id":1573},"architecture","Architecture",[415,1576,1577,1583,1589],{},[418,1578,1579,1582],{},[607,1580,1581],{},"Uptrace API"," receives data from clients, validates it, applies rate limits, and writes to Kafka.",[418,1584,1585,1588],{},[607,1586,1587],{},"Uptrace Worker"," consumes raw data, processes it (sampling, service graph, etc.), and publishes to a second Kafka topic.",[418,1590,1591,1593,1594,632],{},[607,1592,571],{}," consumes directly from that topic using the ",[422,1595,1598],{"href":1596,"rel":1597},"https:\u002F\u002Fclickhouse.com\u002Fdocs\u002Fengines\u002Ftable-engines\u002Fintegrations\u002Fkafka",[495],"Kafka engine",[754,1600,1604],{"className":1601,"code":1602,"language":1603,"meta":759,"style":759},"language-mermaid shiki shiki-themes github-light","graph TD\n    Clients[\"Clients\\n(OTel SDK, Collector)\"]\n    API[\"Uptrace API\\nvalidate, rate-limit\"]\n    K1[\"Kafka\\n(raw topics)\"]\n    Worker[\"Uptrace Worker\\nsampling, service graph\"]\n    K2[\"Kafka\\n(processed topics)\"]\n    CH[(\"ClickHouse\")]\n\n    Clients --> API\n    API --> K1\n    K1 --> Worker\n    Worker --> K2\n    K2 -->|Kafka engine| CH\n","mermaid",[610,1605,1606,1611,1616,1621,1626,1631,1636,1641,1645,1650,1655,1660,1665],{"__ignoreMap":759},[763,1607,1608],{"class":765,"line":766},[763,1609,1610],{},"graph TD\n",[763,1612,1613],{"class":765,"line":777},[763,1614,1615],{},"    Clients[\"Clients\\n(OTel SDK, Collector)\"]\n",[763,1617,1618],{"class":765,"line":934},[763,1619,1620],{},"    API[\"Uptrace API\\nvalidate, rate-limit\"]\n",[763,1622,1623],{"class":765,"line":943},[763,1624,1625],{},"    K1[\"Kafka\\n(raw topics)\"]\n",[763,1627,1628],{"class":765,"line":956},[763,1629,1630],{},"    Worker[\"Uptrace Worker\\nsampling, service graph\"]\n",[763,1632,1633],{"class":765,"line":962},[763,1634,1635],{},"    K2[\"Kafka\\n(processed topics)\"]\n",[763,1637,1638],{"class":765,"line":970},[763,1639,1640],{},"    CH[(\"ClickHouse\")]\n",[763,1642,1643],{"class":765,"line":980},[763,1644,959],{"emptyLinePlaceholder":30},[763,1646,1647],{"class":765,"line":990},[763,1648,1649],{},"    Clients --> API\n",[763,1651,1652],{"class":765,"line":1003},[763,1653,1654],{},"    API --> K1\n",[763,1656,1657],{"class":765,"line":1008},[763,1658,1659],{},"    K1 --> Worker\n",[763,1661,1662],{"class":765,"line":1016},[763,1663,1664],{},"    Worker --> K2\n",[763,1666,1667],{"class":765,"line":1026},[763,1668,1669],{},"    K2 -->|Kafka engine| CH\n",[411,1671,1672],{},"Each component scales and fails independently — the API accepts data at line rate, the worker processes at its own pace, and ClickHouse consumes with its own batching strategy.",[1674,1675,1676],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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 .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}",{"title":759,"searchDepth":943,"depth":777,"links":1678},[1679,1684,1685,1691,1697,1698],{"id":481,"depth":777,"text":482,"children":1680},[1681,1682,1683],{"id":486,"depth":934,"text":487},{"id":506,"depth":934,"text":507},{"id":513,"depth":934,"text":514},{"id":596,"depth":777,"text":597},{"id":674,"depth":777,"text":440,"children":1686},[1687,1688,1689,1690],{"id":670,"depth":934,"text":670},{"id":617,"depth":934,"text":617},{"id":631,"depth":934,"text":631},{"id":905,"depth":934,"text":906},{"id":1145,"depth":777,"text":1146,"children":1692},[1693,1694,1695,1696],{"id":653,"depth":934,"text":653},{"id":660,"depth":934,"text":660},{"id":1255,"depth":934,"text":1255},{"id":1258,"depth":934,"text":1258},{"id":1330,"depth":777,"text":456},{"id":1542,"depth":777,"text":1543,"children":1699},[1700],{"id":1573,"depth":934,"text":1574},"Tune Uptrace processing pipelines, ClickHouse inserts, and optionally add Kafka for high-volume ingestion.","md","\u002Fget\u002Fcover\u002Fscale.webp",{"readingTime":1705},{"text":1706,"minutes":1707,"time":1708,"words":1709},"7 min read",6.605,396300,1321,{"title":65},{"title":406,"description":1701},false,"K-cz36paC8jNyYa0xx_NmZo4-VSz_8U-L_U7LGmBq04",[1715,1717],{"title":61,"path":62,"stem":63,"description":1716,"children":-1},"Troubleshoot self-hosted Uptrace by checking versions, reading service logs, and enabling verbose ClickHouse or PostgreSQL diagnostics.",{"title":5,"path":70,"stem":71,"description":1718,"children":-1},"Step-by-step guide to install and configure OpenTelemetry C++ SDK, export telemetry to Uptrace via OTLP.",1779957314557]