<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tempo HTTP API on Grafana Labs</title><link>https://grafana.com/docs/tempo/v3.0.x/api_docs/</link><description>Recent content in Tempo HTTP API on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/tempo/v3.0.x/api_docs/index.xml" rel="self" type="application/rss+xml"/><item><title>Tempo MCP server</title><link>https://grafana.com/docs/tempo/v3.0.x/api_docs/mcp-server/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/api_docs/mcp-server/</guid><content><![CDATA[&lt;h1 id=&#34;model-context-protocol-mcp-server&#34;&gt;Model Context Protocol (MCP) Server&lt;/h1&gt;
&lt;p&gt;Tempo includes an MCP (Model Context Protocol) server that provides AI assistants and large language models (LLMs) with direct access to distributed tracing data through TraceQL queries and other endpoints.&lt;/p&gt;
&lt;p&gt;For examples on how you can use the MCP server, refer to &lt;a href=&#34;/blog/2025/08/13/llm-powered-insights-into-your-tracing-data-introducing-mcp-support-in-grafana-cloud-traces/&#34;&gt;LLM-powered insights into your tracing data: introducing MCP support in Grafana Cloud Traces&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information on MCP, refer to the &lt;a href=&#34;https://modelcontextprotocol.io/docs/getting-started/intro&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MCP documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;
&lt;p&gt;You can enable the MCP server in your Tempo configuration via YAML:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;query_frontend:
  mcp_server:
    enabled: true&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Or via a command-line flag: &lt;code&gt;--query-frontend.mcp-server.enabled=true&lt;/code&gt;.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-warning&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Be aware that using this feature may cause tracing data to be passed to an LLM or LLM provider. Consider the content of your tracing data and organizational policies when enabling this feature.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;The MCP server uses the same authentication and &lt;a href=&#34;../../operations/manage-advanced-systems/multitenancy/&#34;&gt;multi-tenancy&lt;/a&gt; behavior as other Tempo API endpoints.&lt;/p&gt;
&lt;h2 id=&#34;available-tools&#34;&gt;Available tools&lt;/h2&gt;
&lt;p&gt;The MCP server exposes the following tools that AI assistants can use to interact with your tracing data:&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Tool&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;traceql-search&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Search for traces using TraceQL queries&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;traceql-metrics-instant&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Retrieve a single metric value given a TraceQL metrics query&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;traceql-metrics-range&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Retrieve a metric series given a TraceQL metrics query&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;get-trace&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Retrieve a specific trace by ID&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;get-attribute-names&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Get available attribute names for use in TraceQL queries&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;get-attribute-values&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Get values for a specific scoped attribute name&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;docs-traceql&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Retrieve TraceQL documentation (basic, aggregates, structural, metrics)&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;available-resources&#34;&gt;Available resources&lt;/h2&gt;
&lt;p&gt;The MCP server also provides the following resources containing TraceQL documentation:&lt;/p&gt;
&lt;section class=&#34;expand-table-wrapper&#34;&gt;&lt;div class=&#34;button-div&#34;&gt;
      &lt;button class=&#34;expand-table-btn&#34;&gt;Expand table&lt;/button&gt;
    &lt;/div&gt;&lt;div class=&#34;responsive-table-wrapper&#34;&gt;
    &lt;table&gt;
      &lt;thead&gt;
          &lt;tr&gt;
              &lt;th&gt;Resource URI&lt;/th&gt;
              &lt;th&gt;Description&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;docs://traceql/basic&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Basic TraceQL syntax, intrinsics, operators, and attributes&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;docs://traceql/aggregates&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;TraceQL aggregate functions (count, sum, etc.)&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;docs://traceql/structural&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Advanced structural query patterns&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;docs://traceql/metrics&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Generating metrics from tracing data with TraceQL&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;h2 id=&#34;quick-start&#34;&gt;Quick start&lt;/h2&gt;
&lt;p&gt;To experiment with the MCP server using dummy data and Claude Code:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run the local docker-compose example in &lt;code&gt;/example/docker-compose/single-binary&lt;/code&gt;. This exposes the MCP server at &lt;code&gt;http://localhost:3200/api/mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;claude mcp add --transport=http tempo http://localhost:3200/api/mcp&lt;/code&gt; to add a reference to Claude Code.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;claude&lt;/code&gt; and ask some questions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Tempo MCP server uses the Streamable HTTP transport.
Any MCP client that supports this transport can connect directly using the URL &lt;code&gt;http://&amp;lt;tempo-host&amp;gt;:&amp;lt;port&amp;gt;/api/mcp&lt;/code&gt;.
For example, in Cursor you can add the server with &lt;code&gt;type: &amp;quot;streamableHttp&amp;quot;&lt;/code&gt; in your MCP configuration.&lt;/p&gt;
&lt;p&gt;If your client doesn&amp;rsquo;t support Streamable HTTP natively, you can use the &lt;a href=&#34;https://www.npmjs.com/package/mcp-remote&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;mcp-remote&lt;/code&gt;&lt;/a&gt; package as a bridge.&lt;/p&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/tempo/claude-code-tempo-mcp.png&#34;
  alt=&#34;Claude Code interacting with the Tempo MCP server&#34; width=&#34;5080&#34;
     height=&#34;2488&#34;/&gt;&lt;/p&gt;
]]></content><description>&lt;h1 id="model-context-protocol-mcp-server">Model Context Protocol (MCP) Server&lt;/h1>
&lt;p>Tempo includes an MCP (Model Context Protocol) server that provides AI assistants and large language models (LLMs) with direct access to distributed tracing data through TraceQL queries and other endpoints.&lt;/p></description></item><item><title>Push spans with HTTP</title><link>https://grafana.com/docs/tempo/v3.0.x/api_docs/pushing-spans-with-http/</link><pubDate>Thu, 28 May 2026 17:50:33 +0100</pubDate><guid>https://grafana.com/docs/tempo/v3.0.x/api_docs/pushing-spans-with-http/</guid><content><![CDATA[&lt;h1 id=&#34;push-spans-with-http&#34;&gt;Push spans with HTTP&lt;/h1&gt;
&lt;p&gt;Sometimes using a tracing system is intimidating because it seems like you need complex application instrumentation
or a span ingestion pipeline in order to push spans. This guide aims to show an extremely basic technique for
pushing spans with HTTP/JSON from a Bash script using the &lt;a href=&#34;https://opentelemetry.io/docs/specs/otlp/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OpenTelemetry&lt;/a&gt; receiver.&lt;/p&gt;
&lt;h2 id=&#34;before-you-begin&#34;&gt;Before you begin&lt;/h2&gt;
&lt;p&gt;This procedure uses an example Docker Compose setup to run Tempo, so you don&amp;rsquo;t need an existing installation. The Docker image also includes a Grafana container which lets you visualize traces.&lt;/p&gt;
&lt;p&gt;To use this procedure, you need to have Docker and &lt;code&gt;docker compose&lt;/code&gt; installed.&lt;/p&gt;
&lt;h2 id=&#34;start-tempo-using-the-quick-start&#34;&gt;Start Tempo using the quick start&lt;/h2&gt;
&lt;p&gt;Use the instructions in the 
    &lt;a href=&#34;/docs/tempo/v3.0.x/getting-started/docker-example/&#34;&gt;Quick start for Tempo documentation&lt;/a&gt; to start a local instance of Tempo and Grafana.&lt;/p&gt;
&lt;h2 id=&#34;push-spans-with-otlp&#34;&gt;Push spans with OTLP&lt;/h2&gt;
&lt;p&gt;Now that Tempo is running and listening on port 4318 for &lt;a href=&#34;https://opentelemetry.io/docs/specs/otlp/#otlphttp&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OTLP spans&lt;/a&gt;, you can push a span to Tempo using &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Before you can use this example, you need to update the start and end time.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;startTimeUnixNano&lt;/code&gt; and &lt;code&gt;endTimeUnixNano&lt;/code&gt; fields are in nanoseconds, where 100000000 nanoseconds is 100 milliseconds. The nanosecond value can be obtained by any tool that provides the epoch date in nanoseconds.
For example, under Linux, you can use &lt;code&gt;date &#43;%s%N&lt;/code&gt;.
You can also use an online tool such as &lt;a href=&#34;https://www.epochconverter.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Epoch Converter&lt;/a&gt; to get the current time in nanoseconds.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Copy and paste the &lt;code&gt;curl&lt;/code&gt; command into a text editor.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;curl -X POST -H &amp;#39;Content-Type: application/json&amp;#39; http://localhost:4318/v1/traces -d &amp;#39;
{
	&amp;#34;resourceSpans&amp;#34;: [{
    	&amp;#34;resource&amp;#34;: {
        	&amp;#34;attributes&amp;#34;: [{
            	&amp;#34;key&amp;#34;: &amp;#34;service.name&amp;#34;,
            	&amp;#34;value&amp;#34;: {
                	&amp;#34;stringValue&amp;#34;: &amp;#34;my.service&amp;#34;
            	}
        	}]
    	},
    	&amp;#34;scopeSpans&amp;#34;: [{
        	&amp;#34;scope&amp;#34;: {
            	&amp;#34;name&amp;#34;: &amp;#34;my.library&amp;#34;,
            	&amp;#34;version&amp;#34;: &amp;#34;1.0.0&amp;#34;,
            	&amp;#34;attributes&amp;#34;: [{
                	&amp;#34;key&amp;#34;: &amp;#34;my.scope.attribute&amp;#34;,
                	&amp;#34;value&amp;#34;: {
                    	&amp;#34;stringValue&amp;#34;: &amp;#34;some scope attribute&amp;#34;
                	}
            	}]
        	},
        	&amp;#34;spans&amp;#34;: [
        	{
            	&amp;#34;traceId&amp;#34;: &amp;#34;5B8EFFF798038103D269B633813FC700&amp;#34;,
            	&amp;#34;spanId&amp;#34;: &amp;#34;EEE19B7EC3C1B100&amp;#34;,
            	&amp;#34;name&amp;#34;: &amp;#34;I am a span!&amp;#34;,
            	&amp;#34;startTimeUnixNano&amp;#34;: 1689969302000000000,
            	&amp;#34;endTimeUnixNano&amp;#34;: 1689970000000000000,
            	&amp;#34;kind&amp;#34;: 2,
            	&amp;#34;attributes&amp;#34;: [
            	{
                	&amp;#34;key&amp;#34;: &amp;#34;my.span.attr&amp;#34;,
                	&amp;#34;value&amp;#34;: {
                    	&amp;#34;stringValue&amp;#34;: &amp;#34;some value&amp;#34;
                	}
            	}]
        	}]
    	}]
	}]
}&amp;#39;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Replace &lt;code&gt;startTimeUnixNano&lt;/code&gt; and &lt;code&gt;endTimeUnixNano&lt;/code&gt; with current values for the last 24 hours to allow you to search for them using a 24 hour relative time range. You can get this in seconds and milliseconds from the &lt;a href=&#34;https://www.epochconverter.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Unix Epoch Clock&lt;/a&gt;.
For &lt;code&gt;startTimeUnixNano&lt;/code&gt;, use the current time minus 24 hours. Use the link above to figure out the value.
For &lt;code&gt;endTimeUnixNano&lt;/code&gt;, use the current time.&lt;/p&gt;
&lt;p&gt;Multiply the milliseconds value by 1,000,000 to turn it into nanoseconds. You can do this from a bash terminal with the following command. Replace &lt;code&gt;&amp;lt;epochTimeMilliseconds&amp;gt;&lt;/code&gt; with the milliseconds value.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;echo $((&amp;lt;epochTimeMilliseconds&amp;gt; * 1000000))&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy the updated curl command to a terminal window and run it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;ol&gt;
&lt;li&gt;View the trace in Grafana:
&lt;ol&gt;
&lt;li&gt;Open a browser window to http://localhost:3000.&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;Explore&lt;/strong&gt; page and select the Tempo data source.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Search&lt;/strong&gt; query type.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Run query&lt;/strong&gt; to list available traces.&lt;/li&gt;
&lt;li&gt;Select the trace ID (yellow box) to view details about the trace and its spans.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img
  class=&#34;lazyload d-inline-block&#34;
  data-src=&#34;/static/img/docs/tempo/push-spans-search-span-grafana.png&#34;
  alt=&#34;Using the TraceQL query builder on Explore to view pushed trace in Grafana.&#34; width=&#34;1537&#34;
     height=&#34;745&#34;/&gt;&lt;/p&gt;
&lt;h2 id=&#34;retrieve-traces&#34;&gt;Retrieve traces&lt;/h2&gt;
&lt;p&gt;The easiest way to get the trace is to execute a simple curl command to Tempo. The returned format is &lt;a href=&#34;https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/trace/v1/trace.proto&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;OTLP&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Replace the trace ID in the &lt;code&gt;curl&lt;/code&gt; command with the trace ID that was generated from the push. This information is in the data that&amp;rsquo;s sent with the &lt;code&gt;curl&lt;/code&gt;. You could use Grafana’s Explorer page to find this, as shown in the previous section.&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;curl http://localhost:3200/api/v2/traces/5b8efff798038103d269b633813fc700

{&amp;#34;trace&amp;#34;: {&amp;#34;resourceSpans&amp;#34;:[{&amp;#34;resource&amp;#34;:{&amp;#34;attributes&amp;#34;:[{&amp;#34;key&amp;#34;:&amp;#34;service.name&amp;#34;,&amp;#34;value&amp;#34;:{&amp;#34;stringValue&amp;#34;:&amp;#34;my.service&amp;#34;}}]},&amp;#34;scopeSpans&amp;#34;:[{&amp;#34;scope&amp;#34;:{&amp;#34;name&amp;#34;:&amp;#34;my.library&amp;#34;,&amp;#34;version&amp;#34;:&amp;#34;1.0.0&amp;#34;},&amp;#34;spans&amp;#34;:[{&amp;#34;traceId&amp;#34;:&amp;#34;W47/95gDgQPSabYzgT/HAA==&amp;#34;,&amp;#34;spanId&amp;#34;:&amp;#34;7uGbfsPBsQA=&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;I am a span!&amp;#34;,&amp;#34;kind&amp;#34;:&amp;#34;SPAN_KIND_SERVER&amp;#34;,&amp;#34;startTimeUnixNano&amp;#34;:&amp;#34;1689969302000000000&amp;#34;,&amp;#34;endTimeUnixNano&amp;#34;:&amp;#34;1689970000000000000&amp;#34;,&amp;#34;attributes&amp;#34;:[{&amp;#34;key&amp;#34;:&amp;#34;my.span.attr&amp;#34;,&amp;#34;value&amp;#34;:{&amp;#34;stringValue&amp;#34;:&amp;#34;some value&amp;#34;}}],&amp;#34;status&amp;#34;:{}}]}]}]}}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Copy and paste the updated &lt;code&gt;curl&lt;/code&gt; command into a terminal window.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;use-traceql-to-search-for-a-trace&#34;&gt;Use TraceQL to search for a trace&lt;/h3&gt;
&lt;p&gt;Alternatively, you can also use 
    &lt;a href=&#34;/docs/tempo/v3.0.x/traceql/&#34;&gt;TraceQL&lt;/a&gt; to search for the trace that was pushed.
You can search by using the unique trace attributes that were set:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;curl -G -s http://localhost:3200/api/search --data-urlencode &amp;#39;q={ .service.name = &amp;#34;my.service&amp;#34; }&amp;#39;

{&amp;#34;traces&amp;#34;:[{&amp;#34;traceID&amp;#34;:&amp;#34;5b8efff798038103d269b633813fc700&amp;#34;,&amp;#34;rootServiceName&amp;#34;:&amp;#34;my.service&amp;#34;,&amp;#34;rootTraceName&amp;#34;:&amp;#34;I am a span!&amp;#34;,&amp;#34;startTimeUnixNano&amp;#34;:&amp;#34;1694718625557000000&amp;#34;,&amp;#34;durationMs&amp;#34;:10000,&amp;#34;spanSet&amp;#34;:{&amp;#34;spans&amp;#34;:[{&amp;#34;spanID&amp;#34;:&amp;#34;eee19b7ec3c1b100&amp;#34;,&amp;#34;startTimeUnixNano&amp;#34;:&amp;#34;1694718625557000000&amp;#34;,&amp;#34;durationNanos&amp;#34;:&amp;#34;10000000000&amp;#34;,&amp;#34;attributes&amp;#34;:[{&amp;#34;key&amp;#34;:&amp;#34;service.name&amp;#34;,&amp;#34;value&amp;#34;:{&amp;#34;stringValue&amp;#34;:&amp;#34;my.service&amp;#34;}}]}],&amp;#34;matched&amp;#34;:1},&amp;#34;spanSets&amp;#34;:[{&amp;#34;spans&amp;#34;:[{&amp;#34;spanID&amp;#34;:&amp;#34;eee19b7ec3c1b100&amp;#34;,&amp;#34;startTimeUnixNano&amp;#34;:&amp;#34;1694718625557000000&amp;#34;,&amp;#34;durationNanos&amp;#34;:&amp;#34;10000000000&amp;#34;,&amp;#34;attributes&amp;#34;:[{&amp;#34;key&amp;#34;:&amp;#34;service.name&amp;#34;,&amp;#34;value&amp;#34;:{&amp;#34;stringValue&amp;#34;:&amp;#34;my.service&amp;#34;}}]}],&amp;#34;matched&amp;#34;:1}]}],&amp;#34;metrics&amp;#34;:{&amp;#34;inspectedBytes&amp;#34;:&amp;#34;292781&amp;#34;,&amp;#34;completedJobs&amp;#34;:1,&amp;#34;totalJobs&amp;#34;:1}}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To format this in a more human-readable output, consider using a &lt;a href=&#34;https://jqlang.github.io/jq/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;tool such as &lt;code&gt;jq&lt;/code&gt;&lt;/a&gt;, which lets you to run the same &lt;code&gt;curl&lt;/code&gt; command and pipe it to &lt;code&gt;jq&lt;/code&gt; to format the block. For example:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;Bash&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;curl -G -s http://localhost:3200/api/search --data-urlencode &amp;#39;q={ .service.name = &amp;#34;my.service&amp;#34; }&amp;#39; | jq&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;spans-from-everything&#34;&gt;Spans from everything&lt;/h2&gt;
&lt;p&gt;Tracing isn&amp;rsquo;t limited to enterprise languages with complex frameworks.
As you can see, it&amp;rsquo;s easy to store and track events from your js, python or bash scripts.
You can use Tempo and distributed tracing today to trace CI pipelines, long running bash processes, python data processing flows, or anything else
you can think of.&lt;/p&gt;
&lt;p&gt;Happy tracing!&lt;/p&gt;
]]></content><description>&lt;h1 id="push-spans-with-http">Push spans with HTTP&lt;/h1>
&lt;p>Sometimes using a tracing system is intimidating because it seems like you need complex application instrumentation
or a span ingestion pipeline in order to push spans. This guide aims to show an extremely basic technique for
pushing spans with HTTP/JSON from a Bash script using the &lt;a href="https://opentelemetry.io/docs/specs/otlp/" target="_blank" rel="noopener noreferrer">OpenTelemetry&lt;/a> receiver.&lt;/p></description></item></channel></rss>