PageSourceSearch

https://quickwit.io/assets/js/17e18383.081f778f.js

js quickwit.io collected 2026-10-02 05:36:44 UTC 9,400 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkquickwit_io=self.webpackChunkquickwit_io||[]).push([[18098],{3905:(e,t,i)=>{i.d(t,{Zo:()=>u,kt:()=>h});var n=i(67294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function a(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function o(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?a(Object(i),!0).forEach((function(t){r(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):a(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function s(e,t){if(null==e)return{};var i,n,r=function(e,t){if(null==e)return{};var i,n,r={},a=Object.keys(e);for(n=0;n<a.length;n++)i=a[n],t.indexOf(i)>=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)i=a[n],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var l=n.createContext({}),c=function(e){var t=n.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},g=n.forwardRef((function(e,t){var i=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(i),g=r,h=p["".concat(l,".").concat(g)]||p[g]||d[g]||a;return i?n.createElement(h,o(o({ref:t},u),{},{components:i})):n.createElement(h,o({ref:t},u))}));function h(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=i.length,o=new Array(a);o[0]=g;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,o[1]=s;for(var c=2;c<a;c++)o[c]=i[c];return n.createElement.apply(null,o)}return n.createElement.apply(null,i)}g.displayName="MDXCreateElement"},1645:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=i(87462),r=(i(67294),i(3905));const a={title:"Plug Quickwit to Jaeger",description:"A simple tutorial to use Jaeger with Quickwit backend.",icon_url:"/img/tutorials/quickwit-logo.png",tags:["traces","ingestion"],sidebar_position:2},o=void 0,s={unversionedId:"distributed-tracing/plug-quickwit-to-jaeger",id:"version-0.7.1/distributed-tracing/plug-quickwit-to-jaeger",title:"Plug Quickwit to Jaeger",description:"A simple tutorial to use Jaeger with Quickwit backend.",source:"@site/versioned_docs/version-0.7.1/distributed-tracing/plug-quickwit-to-jaeger.md",sourceDirName:"distributed-tracing",slug:"/distributed-tracing/plug-quickwit-to-jaeger",permalink:"/docs/0.7.1/distributed-tracing/plug-quickwit-to-jaeger",draft:!1,tags:[{label:"traces",permalink:"/docs/0.7.1/tags/traces"},{label:"ingestion",permalink:"/docs/0.7.1/tags/ingestion"}],version:"0.7.1",sidebarPosition:2,frontMatter:{title:"Plug Quickwit to Jaeger",description:"A simple tutorial to use Jaeger with Quickwit backend.",icon_url:"/img/tutorials/quickwit-logo.png",tags:["traces","ingestion"],sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Overview",permalink:"/docs/0.7.1/distributed-tracing/overview"},next:{title:"Using OTEL Collector",permalink:"/docs/0.7.1/distributed-tracing/send-traces/using-otel-collector"}},l={},c=[{value:"Start Quickwit",id:"start-quickwit",level:2},{value:"Start Jaeger UI",id:"start-jaeger-ui",level:2},{value:"MacOS &amp; Windows",id:"macos--windows",level:3},{value:"Linux",id:"linux",level:3},{value:"Search traces in Jaeger UI",id:"search-traces-in-jaeger-ui",level:2},{value:"Next steps",id:"next-steps",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...a}=e;return(0,r.kt)(p,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"In this tutorial, we will show you how Quickwit can eat its own dog food: we will send Quickwit traces into Jaeger and analyze them, which will generate new traces to analyze :)"),(0,r.kt)("h2",{id:"start-quickwit"},"Start Quickwit"),(0,r.kt)("p",null,"First, start a ",(0,r.kt)("a",{parentName:"p",href:"/docs/0.7.1/get-started/installation"},"Quickwit instance")," with the OTLP service enabled:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"QW_ENABLE_OPENTELEMETRY_OTLP_EXPORTER=true \\\nOTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:7281 \\\n./quickwit run\n")),(0,r.kt)("p",null,"We also set ",(0,r.kt)("inlineCode",{parentName:"p"},"QW_ENABLE_OPENTELEMETRY_OTLP_EXPORTER")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"OTEL_EXPORTER_OTLP_ENDPOINT")," environment variables so that Quickwit will send its own traces to itself."),(0,r.kt)("h2",{id:"start-jaeger-ui"},"Start Jaeger UI"),(0,r.kt)("p",null,"Let's start a Jaeger UI instance with docker. Here we need to inform jaeger that it should use quickwit as its backend."),(0,r.kt)("p",null,"Due to some idiosyncrasy associated with networking with containers, we will have to use a different approach on MacOS & Windows on one side, and Linux on the other side."),(0,r.kt)("h3",{id:"macos--windows"},"MacOS & Windows"),(0,r.kt)("p",null,"We can rely on ",(0,r.kt)("inlineCode",{parentName:"p"},"host.docker.internal")," to get the docker bridge ip address, pointing to our quickwit server."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"docker run --rm --name jaeger-qw \\\n    -e SPAN_STORAGE_TYPE=grpc-plugin \\\n    -e GRPC_STORAGE_SERVER=host.docker.internal:7281 \\\n    -p 16686:16686 \\\n    jaegertracing/jaeger-query:latest\n")),(0,r.kt)("h3",{id:"linux"},"Linux"),(0,r.kt)("p",null,"By default, Quickwit is listening to ",(0,r.kt)("inlineCode",{parentName:"p"},"127.0.0.1"),", and will not respond to request directed\nto the docker bridge (",(0,r.kt)("inlineCode",{parentName:"p"},"172.17.0.1"),"). There are different ways to solve this problem.\nThe easiest is probably to use host network mode."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"docker run --rm --name jaeger-qw  --network=host \\\n    -e SPAN_STORAGE_TYPE=grpc-plugin \\\n    -e GRPC_STORAGE_SERVER=127.0.0.1:7281 \\\n    -p 16686:16686 \\\n    jaegertracing/jaeger-query:latest\n\n")),(0,r.kt)("h2",{id:"search-traces-in-jaeger-ui"},"Search traces in Jaeger UI"),(0,r.kt)("p",null,"As Quickwit is indexing its own traces, you should be able to see them in Jaeger UI after 5 seconds (the time it takes for Quickwit to do its first commit)."),(0,r.kt)("p",null,"Open the Jaeger UI at ",(0,r.kt)("a",{parentName:"p",href:"http://localhost:16686"},"http://localhost:16686")," and search for traces! By executing search queries, you will then see Quickwit's own traces:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"find_traces")," is the endpoint called when you search for traces in Jaeger UI, it then calls ",(0,r.kt)("inlineCode",{parentName:"li"},"find_trace_ids"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"find_traces_ids")," is doing an aggregation query on spans to get unique trace IDs."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"root_search")," is Quickwit search entry point. It calls search on each split (piece of index) in parallel, in a distributed manner, or just locally if there is only one node."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"leaf_search")," is the search entry point on each node. It calls ",(0,r.kt)("inlineCode",{parentName:"li"},"leaf_search_single_split")," on each split."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"leaf_search_single_split")," is the search entry point on a split. It will call consecutively ",(0,r.kt)("inlineCode",{parentName:"li"},"warmup")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"tantivy_search"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"warmup")," is the warmup phase of the search. It prefetches data needed to execute the search query."),
1(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"tantivy_search")," is the search phase of the search. It is executing the search query at horse speeds with the ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/quickwit-oss/tantivy"},"Tantivy"),".")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Quickwit trace in Jaeger UI",src:i(32426).Z,width:"1919",height:"883"})),(0,r.kt)("h2",{id:"next-steps"},"Next steps"),(0,r.kt)("p",null,"You are now ready for the next step: instrumenting your application and sending its traces to Quickwit. You can do it:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"In ",(0,r.kt)("a",{parentName:"li",href:"/docs/0.7.1/distributed-tracing/send-traces/using-otel-sdk-python"},"python"),"."),(0,r.kt)("li",{parentName:"ul"},"And in any other language that OpenTelemetry supports.")))}d.isMDXComponent=!0},32426:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/jaeger-ui-quickwit-trace-analysis-07cdf9fdf32553723fff96bf21bb3214.png"}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.