<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/v2.2.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/v2.2.x/api_docs/index.xml" rel="self" type="application/rss+xml"/><item><title>Metrics summary API</title><link>https://grafana.com/docs/tempo/v2.2.x/api_docs/metrics-summary/</link><pubDate>Fri, 03 Apr 2026 20:44:05 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.2.x/api_docs/metrics-summary/</guid><content><![CDATA[&lt;h1 id=&#34;metrics-summary-api&#34;&gt;Metrics summary API&lt;/h1&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;The Metrics summary API is an &lt;a href=&#34;/docs/release-life-cycle/&#34;&gt;experimental feature&lt;/a&gt; that is disabled by default. To enable it, adjust your configuration as suggested below.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;This document explains how to use the metrics summary API in Tempo.
This API returns RED metrics (span count, erroring span count, and latency information) for &lt;code&gt;kind=server&lt;/code&gt; spans sent to Tempo in the last hour, grouped by a user-specified attribute.&lt;/p&gt;
&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;
&lt;p&gt;To enable the experimental metrics summary API, you must turn on the local blocks processor in the metrics generator.
Be aware that the generator will use considerably more resources, including disk space, if this is enabled:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&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&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;overrides:
  metrics_generator_processors: [..., &amp;#39;local-blocks&amp;#39;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;request&#34;&gt;Request&lt;/h2&gt;
&lt;p&gt;To make a request to this API, use the following endpoint on the query-frontend:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&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&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;GET http://&amp;lt;tempo&amp;gt;/api/metrics/summary&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;query-parameters&#34;&gt;Query Parameters&lt;/h3&gt;
&lt;p&gt;All query parameters must be URL-encoded to preserve non-URL-safe characters in the query such as &lt;code&gt;&amp;amp;&lt;/code&gt;.&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;Name&lt;/th&gt;
              &lt;th&gt;Examples&lt;/th&gt;
              &lt;th&gt;Definition&lt;/th&gt;
              &lt;th&gt;Required?&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;{ resource.service.name = &amp;quot;foo&amp;quot; &amp;amp;&amp;amp; span.http.status_code != 200 }&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The TraceQL query with full syntax. All spans matching this query are included in the calculations. Any valid TraceQL query is supported.&lt;/td&gt;
              &lt;td&gt;Yes&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;groupBy&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;&lt;code&gt;name&lt;/code&gt; &lt;br /&gt; &lt;code&gt;.foo&lt;/code&gt; &lt;br/&gt; &lt;code&gt;resource.namespace&lt;/code&gt; &lt;br/&gt; &lt;code&gt;span.http.url,span.http.status_code&lt;/code&gt; &lt;br&gt;&lt;/td&gt;
              &lt;td&gt;The TraceQL value(s) to group by. Any valid intrinsic or attribute with scope. To group by multiple values use a comma-delimited list.&lt;/td&gt;
              &lt;td&gt;Yes&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;start &lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;1672549200&lt;/td&gt;
              &lt;td&gt;Start of time range in unix seconds. If not specified, then all recent data is queried.&lt;/td&gt;
              &lt;td&gt;No&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;end&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;1672549200&lt;/td&gt;
              &lt;td&gt;End of the time range in unix seconds. If not specified, then all recent data is queried.&lt;/td&gt;
              &lt;td&gt;No&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;&lt;p&gt;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 &amp;#34;$URL/api/metrics/summary&amp;#34; --data-urlencode &amp;#39;q={resource.service.name=&amp;#34;checkout-service&amp;#34;}&amp;#39; --data-urlencode &amp;#39;groupBy=name&amp;#39;&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;response&#34;&gt;Response&lt;/h2&gt;
&lt;p&gt;The Tempo response is a &lt;code&gt;SpanMetricsSummary&lt;/code&gt; object defined in &lt;a href=&#34;https://github.com/grafana/tempo/blob/main/pkg/tempopb/tempo.proto#L234&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;tempo.proto&lt;/a&gt;, relevant section pasted below:&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&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&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;message SpanMetricsSummaryResponse {
  repeated SpanMetricsSummary summaries = 1;
}

message SpanMetricsSummary {
  uint64 spanCount = 1;
  uint64 errorSpanCount = 2;
  TraceQLStatic static = 3;
  uint64 p99 = 4;
  uint64 p95 = 5;
  uint64 p90 = 6;
  uint64 p50 = 7;
}

message TraceQLStatic {
  int32 type = 1;
  int64 n = 2;
  double f = 3;
  string s = 4;
  bool b = 5;
  uint64 d = 6;
  int32 status = 7;
  int32 kind = 8;
}&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The response is returned as JSON following &lt;a href=&#34;https://protobuf.dev/programming-guides/proto3/#json&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;standard protobuf-&amp;gt;JSON mapping rules&lt;/a&gt;.&lt;/p&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;The &lt;code&gt;uint64&lt;/code&gt; fields cannot be fully expressed by JSON numeric values so the fields are serialized as strings.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;p&gt;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;JavaScript&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-javascript&#34;&gt;{
   &amp;#34;summaries&amp;#34;: [
       {
           &amp;#34;spanCount&amp;#34;: &amp;#34;20&amp;#34;,
           &amp;#34;series&amp;#34; : [
               {
                   &amp;#34;key&amp;#34;: &amp;#34;.attr1&amp;#34;,
                   &amp;#34;value&amp;#34;: {
                       &amp;#34;type&amp;#34;: 5,
                       &amp;#34;s&amp;#34;: &amp;#34;foo&amp;#34;
                   },
               },
               ...
           ],
           &amp;#34;p99&amp;#34;: &amp;#34;68719476736&amp;#34;,
           &amp;#34;p95&amp;#34;: &amp;#34;1073741824&amp;#34;,
           &amp;#34;p90&amp;#34;: &amp;#34;1017990479&amp;#34;,
           &amp;#34;p50&amp;#34;: &amp;#34;664499239&amp;#34;
       },&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&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;Field&lt;/th&gt;
              &lt;th&gt;Notes&lt;/th&gt;
          &lt;/tr&gt;
      &lt;/thead&gt;
      &lt;tbody&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;summaries&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The list of metrics per group.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.spanCount&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Number of spans in this group.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.errorSpanCount&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Number of spans with &lt;code&gt;status&lt;/code&gt;=&lt;code&gt;error&lt;/code&gt;. (This field will not be present if the value is &lt;code&gt;0&lt;/code&gt;.)&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.series&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The unique values for this group. A key/value pair will be returned for each entry in &lt;code&gt;groupBy&lt;/code&gt;.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.key&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Key name.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.value&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Value with TraceQL underlying type.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.type&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Data type enum defined &lt;a href=&#34;https://github.com/grafana/tempo/blob/main/pkg/traceql/enum_statics.go#L8&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt; (This field will not be present if the value is &lt;code&gt;0&lt;/code&gt;.) &lt;br/&gt;0 = nil&lt;br/&gt;3 = integer&lt;br/&gt; 4 = float &lt;br/&gt; 5 = string&lt;br/&gt; 6 = bool&lt;br/&gt; 7 = duration&lt;br/&gt; 8 = span status&lt;br/&gt; 9 = span kind&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.n&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Populated if this is an integer value.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.s&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Populated if this is a string value.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.f&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Populated if this is a float value.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.b&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Populated if this is a boolean value.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.d&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Populated if this is a duration value.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.status&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Populated if this is a span status value.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.kind&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;Populated if this is a span kind value.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.p99&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The p99 latency of this group in nanoseconds.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.p95&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The p95 latency of this group in nanoseconds.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.p90&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The p90 latency of this group in nanoseconds.&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;&lt;code&gt;.p50&lt;/code&gt;&lt;/td&gt;
              &lt;td&gt;The p50 latency of this group in nanoseconds.&lt;/td&gt;
          &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/div&gt;
&lt;/section&gt;]]></content><description>&lt;h1 id="metrics-summary-api">Metrics summary API&lt;/h1>
&lt;div class="admonition admonition-warning">&lt;blockquote>&lt;p class="title text-uppercase">Warning&lt;/p>&lt;p>The Metrics summary API is an &lt;a href="/docs/release-life-cycle/">experimental feature&lt;/a> that is disabled by default. To enable it, adjust your configuration as suggested below.&lt;/p></description></item><item><title>Push spans with HTTP</title><link>https://grafana.com/docs/tempo/v2.2.x/api_docs/pushing-spans-with-http/</link><pubDate>Fri, 03 Apr 2026 20:44:05 +0000</pubDate><guid>https://grafana.com/docs/tempo/v2.2.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 do not need an existing installation. The Docker image also includes a Grafana container which will allow us to 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;../../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;, let’s push a span to it 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 as instructed.&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;p&gt;Note that the &lt;code&gt;startTimeUnixNano&lt;/code&gt; field is in nanoseconds and can be obtained by any tool that provides the epoch date in nanoseconds (for example, under Linux, &lt;code&gt;date &#43;%s%8N&lt;/code&gt;). The &lt;code&gt;endTimeUnixNano&lt;/code&gt; field is also in nanoseconds, where 100000000 nanoseconds is 100 milliseconds.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Copy and paste the curl command into a text editor.&lt;/p&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 following link.
Multiple the milliseconds value by 1,000,000 to turn it into nanoseconds. You can do this from a bash terminal with:&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;li&gt;
&lt;p&gt;View the trace in Grafana:&lt;/p&gt;
&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;Explorer&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;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 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;/li&gt;
&lt;/ol&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/traces/5b8efff798038103d269b633813fc700

{&amp;#34;batches&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;ol&gt;
&lt;li&gt;Copy and paste the updated &lt;code&gt;curl&lt;/code&gt; command into a terminal window.&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;../../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 is not 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/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>