Skip to content

Fix tracing filtered search bar query params handling

What does this MR do and why?

The filtered search bar ignores filters stored in the URL query param e.g. go to https://gitlab.com/gitlab-org/opstrace/sandbox/otel-demo/-/tracing?sortBy=timestamp_desc&period[]=1h and note how filters are not loaded from the url. This was caused by a missing argument when parsing the query params that was causing arrays not to be loaded correctly.

I've also taken the chance to improve the testing suite that covers the list component. Namely, I've unmocked some of the utility classes responsible for parsing query params and converting them into filters object, so that we now have a good regression test suite against this kind of issues.

And as a bonus track, I've fixed a couple of minor issues

  • Changed some null values to undefined for consistencies with our usage
  • Added a runtime type check to make the UI more resilient to bad inputs

(Fixes filter bar overriding existing period value wit... (gitlab-org/opstrace/opstrace#2530 - closed))

Screenshots or screen recordings

Before After
  • filters are set in the query params, but are not applied in the filter bar

image.png

  • filters are set in the query params and applied in the filter bar

image.png

How to set up and validate locally

  • Enable observability_tracing feature flag

Apply patch to load mocks ( pbpaste | git apply --allow-empty )

diff --git a/app/assets/javascripts/observability/client.js b/app/assets/javascripts/observability/client.js
index be13e69f225f..b9503e95103f 100644
--- a/app/assets/javascripts/observability/client.js
+++ b/app/assets/javascripts/observability/client.js
@@ -1,21 +1,1524 @@
+/* eslint-disable @gitlab/require-i18n-strings */
 import * as Sentry from '~/sentry/sentry_browser_wrapper';
 import axios from '~/lib/utils/axios_utils';
 import { logError } from '~/lib/logger';
 import { DEFAULT_SORTING_OPTION, SORTING_OPTIONS } from './constants';
 
+const mockData = {
+  project_id: 1,
+  traces: [
+    {
+      timestamp: '2023-10-06T11:55:59.598163997Z',
+      trace_id: 'ccaffd4e-a91a-d804-0e0f-f922c4c95ed7',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 2127527881,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:59.598163997Z',
+          span_id: 'B37C17DBFF15E41D',
+          trace_id: 'ccaffd4e-a91a-d804-0e0f-f922c4c95ed7',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 2127527881,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+      ],
+      totalSpans: 1,
+    },
+    {
+      timestamp: '2023-10-06T11:55:59.475236942Z',
+      trace_id: '82c50614-2aa6-8e33-62b5-a2097d47feef',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 2248422103,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:59.475236942Z',
+          span_id: '0938FA5DA440885E',
+          trace_id: '82c50614-2aa6-8e33-62b5-a2097d47feef',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 2248422103,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+      ],
+      totalSpans: 1,
+    },
+    {
+      timestamp: '2023-10-06T11:55:56.751654326Z',
+      trace_id: '5ffc70f5-2ddd-917c-a5b3-ed4b08aaf1f2',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5002628251,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:56.751654326Z',
+          span_id: '17A162ECC1C0909D',
+          trace_id: '5ffc70f5-2ddd-917c-a5b3-ed4b08aaf1f2',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5002628251,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+      ],
+      totalSpans: 1,
+    },
+    {
+      timestamp: '2023-10-06T11:55:56.718823805Z',
+      trace_id: '2771e54e-7029-3886-9bb1-25a159dda380',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 396589042,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:56.718823805Z',
+          span_id: 'FF943BA1E5266248',
+          trace_id: '2771e54e-7029-3886-9bb1-25a159dda380',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 396589042,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:56.719722Z',
+          span_id: '2589A0DAAC06088D',
+          trace_id: '2771e54e-7029-3886-9bb1-25a159dda380',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 394466000,
+          parent_span_id: 'FF943BA1E5266248',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:56.542930163Z',
+      trace_id: '93dff16a-3ec6-d09b-a154-75a928636a86',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5002656067,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:56.542930163Z',
+          span_id: '747271934A59C0E3',
+          trace_id: '93dff16a-3ec6-d09b-a154-75a928636a86',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5002656067,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+      ],
+      totalSpans: 1,
+    },
+    {
+      timestamp: '2023-10-06T11:55:55.648453589Z',
+      trace_id: '0d3cf1f7-d611-76e2-d776-9265adb1af9b',
+      service_name: 'loadgenerator',
+      operation: 'POST',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5000814327,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:55.648453589Z',
+          span_id: '2C4CEB0BE86B2DA0',
+          trace_id: '0d3cf1f7-d611-76e2-d776-9265adb1af9b',
+          service_name: 'loadgenerator',
+          operation: 'POST',
+          duration_nano: 5000814327,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+      ],
+      totalSpans: 1,
+    },
+    {
+      timestamp: '2023-10-06T11:55:55.279674996Z',
+      trace_id: '5766ddab-7eee-cdae-3586-9f939e789d6a',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 1703361037,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:55.279674996Z',
+          span_id: '733124CF29C09031',
+          trace_id: '5766ddab-7eee-cdae-3586-9f939e789d6a',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 1703361037,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:55.280899Z',
+          span_id: 'EE3A66448BAD6797',
+          trace_id: '5766ddab-7eee-cdae-3586-9f939e789d6a',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 1700994000,
+          parent_span_id: '733124CF29C09031',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:54.155602447Z',
+      trace_id: '512ee0a8-e7ce-f535-9fb7-d24e74970bbd',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5014426685,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:54.155602447Z',
+          span_id: '1C0EF2059EDB15EC',
+          trace_id: '512ee0a8-e7ce-f535-9fb7-d24e74970bbd',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5014426685,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+      ],
+      totalSpans: 1,
+    },
+    {
+      timestamp: '2023-10-06T11:55:53.613428903Z',
+      trace_id: '167dc5d1-fab3-2536-e02a-54aae6ad0e51',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5000100610,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:53.613428903Z',
+          span_id: '6643B634846E8790',
+          trace_id: '167dc5d1-fab3-2536-e02a-54aae6ad0e51',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5000100610,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:53.614291Z',
+          span_id: '0E90919A51493DAB',
+          trace_id: '167dc5d1-fab3-2536-e02a-54aae6ad0e51',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 4998281000,
+          parent_span_id: '6643B634846E8790',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:53.305205604Z',
+      trace_id: 'bee441ce-8417-fc94-c13c-6764c37827b0',
+      service_name: 'frontend-proxy',
+      operation: 'ingress',
+      statusCode: 'STATUS_CODE_UNSET',
+      duration_nano: 493620000,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:53.306589Z',
+          span_id: '7A95C3E94E619E8B',
+          trace_id: 'bee441ce-8417-fc94-c13c-6764c37827b0',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 493620000,
+          parent_span_id: 'DAE1E37B9930821D',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+        {
+          timestamp: '2023-10-06T11:55:53.305205604Z',
+          span_id: 'DAE1E37B9930821D',
+          trace_id: 'bee441ce-8417-fc94-c13c-6764c37827b0',
+          service_name: 'loadgenerator',
+          operation: 'POST',
+          duration_nano: 496549491,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:52.113342692Z',
+      trace_id: '0efe9727-0e5a-f20a-3686-e2a095d4494e',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5002894331,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:52.113342692Z',
+          span_id: '6BDB4DA828A2F7D3',
+          trace_id: '0efe9727-0e5a-f20a-3686-e2a095d4494e',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5002894331,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:52.114429Z',
+          span_id: '59E4FF2E4707BFEA',
+          trace_id: '0efe9727-0e5a-f20a-3686-e2a095d4494e',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 4999835000,
+          parent_span_id: '6BDB4DA828A2F7D3',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:51.981354665Z',
+      trace_id: '3f917d5b-81c1-8319-3aaf-74c7c11bca89',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 1323083652,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:51.981354665Z',
+          span_id: '3D69B158C2AFDFBA',
+          trace_id: '3f917d5b-81c1-8319-3aaf-74c7c11bca89',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 1323083652,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:51.982215Z',
+          span_id: '3588DA6D14910718',
+          trace_id: '3f917d5b-81c1-8319-3aaf-74c7c11bca89',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 1321045000,
+          parent_span_id: '3D69B158C2AFDFBA',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:50.643316698Z',
+      trace_id: '70f3d706-c3cf-57ce-e40d-e8f96f2a9001',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5004455156,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:50.643316698Z',
+          span_id: '612F7863A775A173',
+          trace_id: '70f3d706-c3cf-57ce-e40d-e8f96f2a9001',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5004455156,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:50.644165Z',
+          span_id: '9DF351C79B0676F1',
+          trace_id: '70f3d706-c3cf-57ce-e40d-e8f96f2a9001',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5002605000,
+          parent_span_id: '612F7863A775A173',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:50.212288079Z',
+      trace_id: 'fef41346-a584-daca-bda3-81e6ae743772',
+      service_name: 'featureflagservice',
+      operation: '/featureflags',
+      statusCode: 'STATUS_CODE_UNSET',
+      duration_nano: 2420246,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:50.212288079Z',
+          span_id: '44D4038CC63D0871',
+          trace_id: 'fef41346-a584-daca-bda3-81e6ae743772',
+          service_name: 'featureflagservice',
+          operation: '/featureflags',
+          duration_nano: 2420246,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+        {
+          timestamp: '2023-10-06T11:55:50.212626103Z',
+          span_id: '6163630D76176FF1',
+          trace_id: 'fef41346-a584-daca-bda3-81e6ae743772',
+          service_name: 'featureflagservice',
+          operation: 'featureflagservice.repo.query:featureflags',
+          duration_nano: 1370183,
+          parent_span_id: '44D4038CC63D0871',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:48.799130403Z',
+      trace_id: 'e0ce9945-effc-92c9-a92f-cb252f8db3dd',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 4508060447,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:48.799130403Z',
+          span_id: '9B0B4EDE75DBD151',
+          trace_id: 'e0ce9945-effc-92c9-a92f-cb252f8db3dd',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 4508060447,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:48.800147Z',
+          span_id: 'B4C86FDF2B249A75',
+          trace_id: 'e0ce9945-effc-92c9-a92f-cb252f8db3dd',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 4503193000,
+          parent_span_id: '9B0B4EDE75DBD151',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:48.649676084Z',
+      trace_id: '7e29e2a0-4e88-d554-a828-b7106756a16a',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 960467039,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:48.649676084Z',
+          span_id: '9CFA437044CD601A',
+          trace_id: '7e29e2a0-4e88-d554-a828-b7106756a16a',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 960467039,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:48.650744Z',
+          span_id: '5E0C9408692A8DFA',
+          trace_id: '7e29e2a0-4e88-d554-a828-b7106756a16a',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 958297000,
+          parent_span_id: '9CFA437044CD601A',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:48.303476356Z',
+      trace_id: '62ca5bc0-aa3f-6b7c-1fcf-c54e008bd6ca',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5003432217,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:48.303476356Z',
+          span_id: 'A95584D78DA209EC',
+          trace_id: '62ca5bc0-aa3f-6b7c-1fcf-c54e008bd6ca',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5003432217,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:48.30431Z',
+          span_id: 'F9DEE9CE2F553196',
+          trace_id: '62ca5bc0-aa3f-6b7c-1fcf-c54e008bd6ca',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 4999083000,
+          parent_span_id: 'A95584D78DA209EC',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:44.603635139Z',
+      trace_id: 'ba620100-214c-6002-70e2-317f06613698',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 1480294366,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:44.603635139Z',
+          span_id: 'FF13AB1ED9FC0229',
+          trace_id: 'ba620100-214c-6002-70e2-317f06613698',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 1480294366,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:44.605025Z',
+          span_id: '46D63CE6A105E626',
+          trace_id: 'ba620100-214c-6002-70e2-317f06613698',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 1477836000,
+          parent_span_id: 'FF13AB1ED9FC0229',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:43.465288869Z',
+      trace_id: '206eec00-b21c-66a0-c480-c65026e1ae53',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5003399346,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:43.465288869Z',
+          span_id: '6E5544458A0864D5',
+          trace_id: '206eec00-b21c-66a0-c480-c65026e1ae53',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5003399346,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:43.466157Z',
+          span_id: '8374413A26AA15F1',
+          trace_id: '206eec00-b21c-66a0-c480-c65026e1ae53',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5001446000,
+          parent_span_id: '6E5544458A0864D5',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:41.876908072Z',
+      trace_id: 'e6510ccf-b966-546d-dfd8-a0f14ce7f5ad',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5005142605,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:41.876908072Z',
+          span_id: 'CB0AAA0DD240543D',
+          trace_id: 'e6510ccf-b966-546d-dfd8-a0f14ce7f5ad',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5005142605,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:41.87814Z',
+          span_id: '1E886EC50D17DE09',
+          trace_id: 'e6510ccf-b966-546d-dfd8-a0f14ce7f5ad',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5002625000,
+          parent_span_id: 'CB0AAA0DD240543D',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:41.690765809Z',
+      trace_id: 'c2cea2df-30fa-2df3-fd45-30fa653d1b23',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5006927073,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:41.690765809Z',
+          span_id: '6372BBCBE324D4DF',
+          trace_id: 'c2cea2df-30fa-2df3-fd45-30fa653d1b23',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5006927073,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:41.691638Z',
+          span_id: '7E264C16B5932D29',
+          trace_id: 'c2cea2df-30fa-2df3-fd45-30fa653d1b23',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5004971000,
+          parent_span_id: '6372BBCBE324D4DF',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:41.141410499Z',
+      trace_id: '8557d8d9-ea31-9f57-b076-5580c2ecd542',
+      service_name: 'loadgenerator',
+      operation: 'POST',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 4998737278,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:41.141410499Z',
+          span_id: '1014F6FED940B6DC',
+          trace_id: '8557d8d9-ea31-9f57-b076-5580c2ecd542',
+          service_name: 'loadgenerator',
+          operation: 'POST',
+          duration_nano: 4998737278,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:41.142188Z',
+          span_id: '7C949588AF7D788D',
+          trace_id: '8557d8d9-ea31-9f57-b076-5580c2ecd542',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 4996805000,
+          parent_span_id: '1014F6FED940B6DC',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:41.080812502Z',
+      trace_id: '40dd5e45-b283-6b5b-f7af-0cd5cb92dc9c',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 5003851281,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:41.080812502Z',
+          span_id: '06E4A468012D8639',
+          trace_id: '40dd5e45-b283-6b5b-f7af-0cd5cb92dc9c',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5003851281,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:41.082036Z',
+          span_id: 'BE51364F03C5D820',
+          trace_id: '40dd5e45-b283-6b5b-f7af-0cd5cb92dc9c',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5000885000,
+          parent_span_id: '06E4A468012D8639',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:40.212726902Z',
+      trace_id: 'ae4bd107-3820-e593-a5c6-5898d4c239c2',
+      service_name: 'featureflagservice',
+      operation: '/featureflags',
+      statusCode: 'STATUS_CODE_UNSET',
+      duration_nano: 2511410,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:40.212726902Z',
+          span_id: 'C92EECC4F9575B00',
+          trace_id: 'ae4bd107-3820-e593-a5c6-5898d4c239c2',
+          service_name: 'featureflagservice',
+          operation: '/featureflags',
+          duration_nano: 2511410,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+        {
+          timestamp: '2023-10-06T11:55:40.213119592Z',
+          span_id: 'A553A8DE107E8CB8',
+          trace_id: 'ae4bd107-3820-e593-a5c6-5898d4c239c2',
+          service_name: 'featureflagservice',
+          operation: 'featureflagservice.repo.query:featureflags',
+          duration_nano: 1229795,
+          parent_span_id: 'C92EECC4F9575B00',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:40.046488271Z',
+      trace_id: 'c53d7dc8-a60f-0d7c-1b60-0879d2c67fc5',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_OK',
+      duration_nano: 2000376195,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:40.046488271Z',
+          span_id: 'C444F1FEC2BA8819',
+          trace_id: 'c53d7dc8-a60f-0d7c-1b60-0879d2c67fc5',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 2000376195,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:40.047866Z',
+          span_id: '55C6FC54E3D5D334',
+          trace_id: 'c53d7dc8-a60f-0d7c-1b60-0879d2c67fc5',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 1997469000,
+          parent_span_id: 'C444F1FEC2BA8819',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:39.201064082Z',
+      trace_id: '6cd194e8-d869-0f8e-e256-d70b44d2819c',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 2848833737,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:39.201064082Z',
+          span_id: '2474C12ADEB41E4F',
+          trace_id: '6cd194e8-d869-0f8e-e256-d70b44d2819c',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 2848833737,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:39.210427Z',
+          span_id: '7C82CE36FB37D71C',
+          trace_id: '6cd194e8-d869-0f8e-e256-d70b44d2819c',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 2834964000,
+          parent_span_id: '2474C12ADEB41E4F',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:37.044547199Z',
+      trace_id: 'b8256ede-d3c5-f260-85b1-45f8fce9e609',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 5004998888,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:37.044547199Z',
+          span_id: 'CC9F510C6A33D5DE',
+          trace_id: 'b8256ede-d3c5-f260-85b1-45f8fce9e609',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5004998888,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:37.045884Z',
+          span_id: '8BA28174DC4F2800',
+          trace_id: 'b8256ede-d3c5-f260-85b1-45f8fce9e609',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 4999544000,
+          parent_span_id: 'CC9F510C6A33D5DE',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:37.04353471Z',
+      trace_id: 'f1d86bf2-a7cb-3114-00f5-619653306fd2',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 5005572363,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:37.04353471Z',
+          span_id: '1CAE17E35616EF02',
+          trace_id: 'f1d86bf2-a7cb-3114-00f5-619653306fd2',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5005572363,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:37.045351Z',
+          span_id: '6D1A0A914A5ACAF2',
+          trace_id: 'f1d86bf2-a7cb-3114-00f5-619653306fd2',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5000457000,
+          parent_span_id: '1CAE17E35616EF02',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:36.138448115Z',
+      trace_id: 'c852fe52-7845-6c20-c9f4-dcd06e35a0d3',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 5002279465,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:36.138448115Z',
+          span_id: '013D44FBAFECAF3E',
+          trace_id: 'c852fe52-7845-6c20-c9f4-dcd06e35a0d3',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5002279465,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:36.139697Z',
+          span_id: 'F5214C79F52FA1D3',
+          trace_id: 'c852fe52-7845-6c20-c9f4-dcd06e35a0d3',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 4999948000,
+          parent_span_id: '013D44FBAFECAF3E',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:35.063009962Z',
+      trace_id: '55ab8cd4-b2fb-e05b-1813-8b92e99715b4',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 2462137886,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:35.063009962Z',
+          span_id: 'E1B4C72A38690973',
+          trace_id: '55ab8cd4-b2fb-e05b-1813-8b92e99715b4',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 2462137886,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:35.064395Z',
+          span_id: 'A52918F4C0929CF5',
+          trace_id: '55ab8cd4-b2fb-e05b-1813-8b92e99715b4',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 2459363000,
+          parent_span_id: 'E1B4C72A38690973',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:34.402711283Z',
+      trace_id: 'a6f5cdfb-48cb-319d-20b0-80d1bc71dfe7',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 5005182495,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:34.402711283Z',
+          span_id: '8FDDAFD8C2F77937',
+          trace_id: 'a6f5cdfb-48cb-319d-20b0-80d1bc71dfe7',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5005182495,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:34.403988Z',
+          span_id: '2B88D36102DEFAA9',
+          trace_id: 'a6f5cdfb-48cb-319d-20b0-80d1bc71dfe7',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5000542000,
+          parent_span_id: '8FDDAFD8C2F77937',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:33.582152671Z',
+      trace_id: 'f14ed0ae-82a2-3821-4a95-988c56506c0a',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 1696858107,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:33.582152671Z',
+          span_id: 'AFF8492F14E36FFA',
+          trace_id: 'f14ed0ae-82a2-3821-4a95-988c56506c0a',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 1696858107,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:33.583699Z',
+          span_id: 'F4F41B58483F800D',
+          trace_id: 'f14ed0ae-82a2-3821-4a95-988c56506c0a',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 1693457000,
+          parent_span_id: 'AFF8492F14E36FFA',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:33.33485647Z',
+      trace_id: '07402476-3308-4282-7202-d7ac61c374a8',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 5003319301,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:33.33485647Z',
+          span_id: 'B468FAAC4680C389',
+          trace_id: '07402476-3308-4282-7202-d7ac61c374a8',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5003319301,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:33.335802Z',
+          span_id: 'CD99B62403B9056D',
+          trace_id: '07402476-3308-4282-7202-d7ac61c374a8',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5001314000,
+          parent_span_id: 'B468FAAC4680C389',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:32.522281159Z',
+      trace_id: 'c9e824bf-ee76-2547-ef6a-5b58c5ae359a',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 360049289,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:32.522281159Z',
+          span_id: 'C533EC62FBCF3BC7',
+          trace_id: 'c9e824bf-ee76-2547-ef6a-5b58c5ae359a',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 360049289,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:32.523484Z',
+          span_id: 'FE66B73C5DA0E3EB',
+          trace_id: 'c9e824bf-ee76-2547-ef6a-5b58c5ae359a',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 356974000,
+          parent_span_id: 'C533EC62FBCF3BC7',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:31.91562832Z',
+      trace_id: '78d2a960-e458-f71e-6c25-5f51a6ca1cc9',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 966326342,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:31.91562832Z',
+          span_id: 'ECF63D15580C0433',
+          trace_id: '78d2a960-e458-f71e-6c25-5f51a6ca1cc9',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 966326342,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:31.916657Z',
+          span_id: 'DBC990DA6678F173',
+          trace_id: '78d2a960-e458-f71e-6c25-5f51a6ca1cc9',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 963854000,
+          parent_span_id: 'ECF63D15580C0433',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:30.395858139Z',
+      trace_id: '4f384bd2-f5ac-2a0c-6fdc-39bc3c7e02de',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 5004048334,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:30.395858139Z',
+          span_id: '9AA29E279BDA0933',
+          trace_id: '4f384bd2-f5ac-2a0c-6fdc-39bc3c7e02de',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5004048334,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:30.397063Z',
+          span_id: '0517F682FD889ADA',
+          trace_id: '4f384bd2-f5ac-2a0c-6fdc-39bc3c7e02de',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5001512000,
+          parent_span_id: '9AA29E279BDA0933',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:30.277148086Z',
+      trace_id: '7f56682e-e0db-779f-7466-c94312aab3f9',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 1534282843,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:30.277148086Z',
+          span_id: 'CDDA802ECF692034',
+          trace_id: '7f56682e-e0db-779f-7466-c94312aab3f9',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 1534282843,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:30.278435Z',
+          span_id: '73454E596A9A590A',
+          trace_id: '7f56682e-e0db-779f-7466-c94312aab3f9',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 1529627000,
+          parent_span_id: 'CDDA802ECF692034',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:30.212587976Z',
+      trace_id: '793a243b-5584-7f2c-2fbe-017e8cd30d17',
+      service_name: 'featureflagservice',
+      operation: '/featureflags',
+      statusCode: 'STATUS_CODE_UNSET',
+      duration_nano: 2107878,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:30.212587976Z',
+          span_id: '898FD4D39776E8C9',
+          trace_id: '793a243b-5584-7f2c-2fbe-017e8cd30d17',
+          service_name: 'featureflagservice',
+          operation: '/featureflags',
+          duration_nano: 2107878,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+        {
+          timestamp: '2023-10-06T11:55:30.212975003Z',
+          span_id: '170E03EA6E912603',
+          trace_id: '793a243b-5584-7f2c-2fbe-017e8cd30d17',
+          service_name: 'featureflagservice',
+          operation: 'featureflagservice.repo.query:featureflags',
+          duration_nano: 1069751,
+          parent_span_id: '898FD4D39776E8C9',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:28.934794988Z',
+      trace_id: '6d24a1b0-3e82-431a-0b55-4a0c84395edd',
+      service_name: 'frontend-proxy',
+      operation: 'ingress',
+      statusCode: 'STATUS_CODE_UNSET',
+      duration_nano: 4999844000,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:28.935829Z',
+          span_id: 'F5698F0154052EDE',
+          trace_id: '6d24a1b0-3e82-431a-0b55-4a0c84395edd',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 4999844000,
+          parent_span_id: 'AC5B5A6B877CC28E',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+        {
+          timestamp: '2023-10-06T11:55:28.934794988Z',
+          span_id: 'AC5B5A6B877CC28E',
+          trace_id: '6d24a1b0-3e82-431a-0b55-4a0c84395edd',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5002384628,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:27.880531908Z',
+      trace_id: 'e8db847b-d5b8-08ff-b1f8-e2d8edf539c9',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 2975295439,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:27.880531908Z',
+          span_id: '8C0FFEF3FB76814D',
+          trace_id: 'e8db847b-d5b8-08ff-b1f8-e2d8edf539c9',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 2975295439,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:27.881633Z',
+          span_id: '1A6E7E04D25BA6E1',
+          trace_id: 'e8db847b-d5b8-08ff-b1f8-e2d8edf539c9',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 2971951000,
+          parent_span_id: '8C0FFEF3FB76814D',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:27.633202774Z',
+      trace_id: '05b75faa-e4a4-77cb-988a-8dd1865b7a43',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 4177888028,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:27.633202774Z',
+          span_id: '1F1C84D589ED847E',
+          trace_id: '05b75faa-e4a4-77cb-988a-8dd1865b7a43',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 4177888028,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:27.634279Z',
+          span_id: '119F25365FBA8469',
+          trace_id: '05b75faa-e4a4-77cb-988a-8dd1865b7a43',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 4173865000,
+          parent_span_id: '1F1C84D589ED847E',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:26.806916235Z',
+      trace_id: 'ffb38eb4-f31f-242a-c4b0-7d8fe6cf80e2',
+      service_name: 'loadgenerator',
+      operation: 'POST',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 5003612673,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:26.806916235Z',
+          span_id: '646E465225A0239A',
+          trace_id: 'ffb38eb4-f31f-242a-c4b0-7d8fe6cf80e2',
+          service_name: 'loadgenerator',
+          operation: 'POST',
+          duration_nano: 5003612673,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:26.807814Z',
+          span_id: '65C72D731F9D16B2',
+          trace_id: 'ffb38eb4-f31f-242a-c4b0-7d8fe6cf80e2',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5000389000,
+          parent_span_id: '646E465225A0239A',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:26.451461426Z',
+      trace_id: '967a9424-3b63-74e8-139b-ce5a91e8d931',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 354667116,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:26.451461426Z',
+          span_id: 'B3DB071411AE52F1',
+          trace_id: '967a9424-3b63-74e8-139b-ce5a91e8d931',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 354667116,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:26.452419Z',
+          span_id: '15D755DD09F55533',
+          trace_id: '967a9424-3b63-74e8-139b-ce5a91e8d931',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 352693000,
+          parent_span_id: 'B3DB071411AE52F1',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:25.851421608Z',
+      trace_id: 'aa447bd7-a854-0914-39f3-3e6b4eae200d',
+      service_name: 'loadgenerator',
+      operation: 'POST',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 5003869067,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:25.851421608Z',
+          span_id: '8E179C425955A841',
+          trace_id: 'aa447bd7-a854-0914-39f3-3e6b4eae200d',
+          service_name: 'loadgenerator',
+          operation: 'POST',
+          duration_nano: 5003869067,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:25.852466Z',
+          span_id: '8618BE9F3CBBF905',
+          trace_id: 'aa447bd7-a854-0914-39f3-3e6b4eae200d',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5001183000,
+          parent_span_id: '8E179C425955A841',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:25.312155662Z',
+      trace_id: '0614bd44-0e43-d66c-146d-1d299e5fcd82',
+      service_name: 'loadgenerator',
+      operation: 'POST',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 538595527,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:25.312155662Z',
+          span_id: 'AA6ACF1D3F8E54EC',
+          trace_id: '0614bd44-0e43-d66c-146d-1d299e5fcd82',
+          service_name: 'loadgenerator',
+          operation: 'POST',
+          duration_nano: 538595527,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:25.31465Z',
+          span_id: '68F9E651179E3EEA',
+          trace_id: '0614bd44-0e43-d66c-146d-1d299e5fcd82',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 534790000,
+          parent_span_id: 'AA6ACF1D3F8E54EC',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:23.696615328Z',
+      trace_id: '7121e26a-485c-b049-ad6b-51019a56f829',
+      service_name: 'frontend-proxy',
+      operation: 'ingress',
+      statusCode: 'STATUS_CODE_UNSET',
+      duration_nano: 5000380000,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:23.697912Z',
+          span_id: 'C295CA98D0119566',
+          trace_id: '7121e26a-485c-b049-ad6b-51019a56f829',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5000380000,
+          parent_span_id: '8A4EF2E93FCFFAC9',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+        {
+          timestamp: '2023-10-06T11:55:23.696615328Z',
+          span_id: '8A4EF2E93FCFFAC9',
+          trace_id: '7121e26a-485c-b049-ad6b-51019a56f829',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5003136653,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:23.2483005Z',
+      trace_id: 'de01ef59-6cff-058c-bf1d-0128f8b3d0be',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 5000646894,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:23.2483005Z',
+          span_id: 'FC7815D4D1991E30',
+          trace_id: 'de01ef59-6cff-058c-bf1d-0128f8b3d0be',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 5000646894,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:23.249229Z',
+          span_id: 'D154D142A462CD2D',
+          trace_id: 'de01ef59-6cff-058c-bf1d-0128f8b3d0be',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 4998661000,
+          parent_span_id: 'FC7815D4D1991E30',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:22.502517932Z',
+      trace_id: 'b42db0ac-e364-36a0-56d1-23d3ab3e9fa4',
+      service_name: 'loadgenerator',
+      operation: 'POST',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 5005224271,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:22.502517932Z',
+          span_id: '3B9A9C3DDAA69C04',
+          trace_id: 'b42db0ac-e364-36a0-56d1-23d3ab3e9fa4',
+          service_name: 'loadgenerator',
+          operation: 'POST',
+          duration_nano: 5005224271,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:22.503613Z',
+          span_id: 'C1DBAEA069A4EFD2',
+          trace_id: 'b42db0ac-e364-36a0-56d1-23d3ab3e9fa4',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 5002788000,
+          parent_span_id: '3B9A9C3DDAA69C04',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:22.307362405Z',
+      trace_id: '070f61c7-5c98-6421-152b-9102f0531a7f',
+      service_name: 'loadgenerator',
+      operation: 'POST',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 3006936837,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:22.307362405Z',
+          span_id: 'F5CC6AB8847A71E9',
+          trace_id: '070f61c7-5c98-6421-152b-9102f0531a7f',
+          service_name: 'loadgenerator',
+          operation: 'POST',
+          duration_nano: 3006936837,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:22.308517Z',
+          span_id: '552A72023A433574',
+          trace_id: '070f61c7-5c98-6421-152b-9102f0531a7f',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 3002823000,
+          parent_span_id: 'F5CC6AB8847A71E9',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+    {
+      timestamp: '2023-10-06T11:55:21.805009204Z',
+      trace_id: '12a263fc-4e09-6a7f-909f-4045830922a8',
+      service_name: 'loadgenerator',
+      operation: 'GET',
+      statusCode: 'STATUS_CODE_ERROR',
+      duration_nano: 502716963,
+      spans: [
+        {
+          timestamp: '2023-10-06T11:55:21.805009204Z',
+          span_id: 'E5ACBF6213EEE7AF',
+          trace_id: '12a263fc-4e09-6a7f-909f-4045830922a8',
+          service_name: 'loadgenerator',
+          operation: 'GET',
+          duration_nano: 502716963,
+          parent_span_id: '',
+          statusCode: 'STATUS_CODE_ERROR',
+        },
+        {
+          timestamp: '2023-10-06T11:55:21.8059Z',
+          span_id: 'BC31EB878CEEF3BB',
+          trace_id: '12a263fc-4e09-6a7f-909f-4045830922a8',
+          service_name: 'frontend-proxy',
+          operation: 'ingress',
+          duration_nano: 498294000,
+          parent_span_id: 'E5ACBF6213EEE7AF',
+          statusCode: 'STATUS_CODE_UNSET',
+        },
+      ],
+      totalSpans: 2,
+    },
+  ],
+  total_traces: 50,
+  next_page_token: 'eyJzdGFydF90aW1lc3RhbXAiOiIyMDIzLTEwLTA2IDExOjU1OjIxLjgwNTAwOTIwNCJ9',
+};
+
 function reportErrorAndThrow(e) {
   logError(e);
   Sentry.captureException(e);
   throw e;
 }
+
+function mockReturnDataWithDelay(data) {
+  return new Promise((resolve) => {
+    setTimeout(() => resolve(data), 500);
+  });
+}
+
 // Provisioning API spec: https://gitlab.com/gitlab-org/opstrace/opstrace/-/blob/main/provisioning-api/pkg/provisioningapi/routes.go#L59
 async function enableObservability(provisioningUrl) {
   try {
     // Note: axios.put(url, undefined, {withCredentials: true}) does not send cookies properly, so need to use the API below for the correct behaviour
-    return await axios(provisioningUrl, {
-      method: 'put',
-      withCredentials: true,
-    });
+    return mockReturnDataWithDelay();
   } catch (e) {
     return reportErrorAndThrow(e);
   }
@@ -24,11 +1527,11 @@ async function enableObservability(provisioningUrl) {
 // Provisioning API spec: https://gitlab.com/gitlab-org/opstrace/opstrace/-/blob/main/provisioning-api/pkg/provisioningapi/routes.go#L37
 async function isObservabilityEnabled(provisioningUrl) {
   try {
-    const { data } = await axios.get(provisioningUrl, { withCredentials: true });
+    const data = { status: 'ready' };
     if (data && data.status) {
       // we currently ignore the 'status' payload and just check if the request was successful
       // We might improve this as part of https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/2315
-      return true;
+      return mockReturnDataWithDelay(true);
     }
   } catch (e) {
     if (e.response.status === 404) {
@@ -40,19 +1543,118 @@ async function isObservabilityEnabled(provisioningUrl) {
 }
 
 async function fetchTrace(tracingUrl, traceId) {
-  try {
-    if (!traceId) {
-      throw new Error('traceId is required.');
-    }
-
-    const { data } = await axios.get(`${tracingUrl}/${traceId}`, {
-      withCredentials: true,
-    });
-
-    return data;
-  } catch (e) {
-    return reportErrorAndThrow(e);
-  }
+  return mockReturnDataWithDelay({
+    timestamp: '2023-11-06T14:58:38.892999936Z',
+    trace_id: 'cfa0e008-002f-5505-0d05-31855d493ea0',
+    service_name: 'frontend',
+    operation: 'HTTP POST',
+    status_code: 'STATUS_CODE_UNSET',
+    duration_nano: 6870528,
+    spans: [
+      {
+        timestamp: '2023-11-06T14:58:38.892999936Z',
+        span_id: '86C2CAF54D03A839',
+        trace_id: 'cfa0e008-002f-5505-0d05-31855d493ea0',
+        service_name: 'frontend',
+        operation: 'HTTP POST',
+        duration_nano: 6870528,
+        parent_span_id: '',
+        status_code: 'STATUS_CODE_UNSET',
+        statusCode: 'STATUS_CODE_UNSET',
+      },
+      {
+        timestamp: '2023-11-06T14:58:38.792999900Z',
+        span_id: '5E95BA1D4DCA629C',
+        trace_id: 'cfa0e008-002f-5505-0d05-31855d493ea0',
+        service_name: 'frontend',
+        operation: 'grpc.oteldemo.CartService/AddItem',
+        duration_nano: 4674123,
+        parent_span_id: '86C2CAF54D03A839',
+        status_code: 'STATUS_CODE_UNSET',
+        statusCode: 'STATUS_CODE_UNSET',
+      },
+      {
+        timestamp: '2023-11-06T14:58:38.897313Z',
+        span_id: '79A1A33CCC36DC44',
+        trace_id: 'cfa0e008-002f-5505-0d05-31855d493ea0',
+        service_name: 'cartservice',
+        operation: 'oteldemo.CartService/AddItem',
+        duration_nano: 1138200,
+        parent_span_id: '5E95BA1D4DCA629C',
+        status_code: 'STATUS_CODE_UNSET',
+        statusCode: 'STATUS_CODE_UNSET',
+      },
+      {
+        timestamp: '2023-11-06T14:58:38.8974467Z',
+        span_id: 'B43E6CFFD9AF4A68',
+        trace_id: 'cfa0e008-002f-5505-0d05-31855d493ea0',
+        service_name: 'cartservice',
+        operation: 'HGET',
+        duration_nano: 360700,
+        parent_span_id: '79A1A33CCC36DC44',
+        status_code: 'STATUS_CODE_UNSET',
+        statusCode: 'STATUS_CODE_UNSET',
+      },
+      {
+        timestamp: '2023-11-06T14:58:38.8978547Z',
+        span_id: '80169B2C61AF41EF',
+        trace_id: 'cfa0e008-002f-5505-0d05-31855d493ea0',
+        service_name: 'cartservice',
+        operation: 'HMSET',
+        duration_nano: 249500,
+        parent_span_id: '79A1A33CCC36DC44',
+        status_code: 'STATUS_CODE_UNSET',
+        statusCode: 'STATUS_CODE_UNSET',
+      },
+      {
+        timestamp: '2023-11-06T14:58:38.897999872Z',
+        span_id: '6C4E28FE982F2F73',
+        trace_id: 'cfa0e008-002f-5505-0d05-31855d493ea0',
+        service_name: 'frontend',
+        operation: 'grpc.oteldemo.CartService/GetCart',
+        duration_nano: 1346816,
+        parent_span_id: '86C2CAF54D03A839',
+        status_code: 'STATUS_CODE_UNSET',
+        statusCode: 'STATUS_CODE_UNSET',
+      },
+      {
+        timestamp: '2023-11-06T14:58:38.8981128Z',
+        span_id: '427F06B0B498A482',
+        trace_id: 'cfa0e008-002f-5505-0d05-31855d493ea0',
+        service_name: 'cartservice',
+        operation: 'EXPIRE',
+        duration_nano: 252200,
+        parent_span_id: '79A1A33CCC36DC44',
+        status_code: 'STATUS_CODE_UNSET',
+        statusCode: 'STATUS_CODE_UNSET',
+      },
+      {
+        timestamp: '2023-11-06T14:58:38.8995004Z',
+        span_id: 'FF45FE0F8C45FD68',
+        trace_id: 'cfa0e008-002f-5505-0d05-31855d493ea0',
+        service_name: 'cartservice',
+        operation: 'oteldemo.CartService/GetCart',
+        duration_nano: 512400,
+        parent_span_id: '6C4E28FE982F2F73',
+        status_code: 'STATUS_CODE_UNSET',
+        statusCode: 'STATUS_CODE_UNSET',
+      },
+      {
+        timestamp: '2023-11-06T14:58:38.8996313Z',
+        span_id: 'F6D0D268E8A84A38',
+        trace_id: 'cfa0e008-002f-5505-0d05-31855d493ea0',
+        service_name: 'cartservice',
+        operation: 'HGET',
+        duration_nano: 290700,
+        parent_span_id: 'FF45FE0F8C45FD68',
+        status_code: 'STATUS_CODE_UNSET',
+        statusCode: 'STATUS_CODE_UNSET',
+      },
+    ],
+    total_spans: 9,
+    totalSpans: 9,
+    statusCode: 'STATUS_CODE_UNSET',
+  });
 }
 
 /**
@@ -198,15 +1800,15 @@ async function fetchTraces(tracingUrl, { filters = {}, pageToken, pageSize, sort
     : DEFAULT_SORTING_OPTION;
   params.append('sort', sortOrder);
 
+  console.log(`fetching traces with params: ${params.toString()}`);
+
   try {
-    const { data } = await axios.get(tracingUrl, {
-      withCredentials: true,
-      params,
-    });
+    const data = mockData;
+
     if (!Array.isArray(data.traces)) {
       throw new Error('traces are missing/invalid in the response'); // eslint-disable-line @gitlab/require-i18n-strings
     }
-    return data;
+    return mockReturnDataWithDelay(data);
   } catch (e) {
     return reportErrorAndThrow(e);
   }
@@ -214,15 +1816,16 @@ async function fetchTraces(tracingUrl, { filters = {}, pageToken, pageSize, sort
 
 async function fetchServices(servicesUrl) {
   try {
-    const { data } = await axios.get(servicesUrl, {
-      withCredentials: true,
-    });
+    const uniqueServices = new Set(
+      mockData.traces.map((t) => t.spans.map((s) => s.service_name)).flat(),
+    );
+    const data = { services: Array.from(uniqueServices).map((s) => ({ name: s })) };
 
     if (!Array.isArray(data.services)) {
       throw new Error('failed to fetch services. invalid response'); // eslint-disable-line @gitlab/require-i18n-strings
     }
 
-    return data.services;
+    return mockReturnDataWithDelay(data.services);
   } catch (e) {
     return reportErrorAndThrow(e);
   }
@@ -237,15 +1840,21 @@ async function fetchOperations(operationsUrl, serviceName) {
       throw new Error('fetchOperations() - operationsUrl must contain $SERVICE_NAME$');
     }
     const url = operationsUrl.replace('$SERVICE_NAME$', serviceName);
-    const { data } = await axios.get(url, {
-      withCredentials: true,
-    });
+
+    console.log('fetching operations suggestions for', url); // eslint-disable-line @gitlab/require-i18n-strings
+    const uniqOps = new Set(
+      mockData.traces
+        .map((t) => t.spans.filter((s) => s.service_name === serviceName))
+        .flat()
+        .map((s) => s.operation),
+    );
+    const data = { operations: Array.from(uniqOps).map((s) => ({ name: s })) };
 
     if (!Array.isArray(data.operations)) {
       throw new Error('failed to fetch operations. invalid response'); // eslint-disable-line @gitlab/require-i18n-strings
     }
 
-    return data.operations;
+    return mockReturnDataWithDelay(data.operations);
   } catch (e) {
     return reportErrorAndThrow(e);
   }
diff --git a/app/assets/javascripts/observability/components/observability_container.vue b/app/assets/javascripts/observability/components/observability_container.vue
index b89c2624f81c..f6cbf7ee771f 100644
--- a/app/assets/javascripts/observability/components/observability_container.vue
+++ b/app/assets/javascripts/observability/components/observability_container.vue
@@ -27,12 +27,12 @@ export default {
 
     // TODO: Improve local GDK dev experience with tracing https://gitlab.com/gitlab-org/opstrace/opstrace/-/issues/2308
     // Uncomment the lines below to to test this locally
-    // setTimeout(() => {
-    //   this.messageHandler({
-    //     data: { type: 'AUTH_COMPLETION', status: 'success' },
-    //     origin: new URL(this.oauthUrl).origin,
-    //   });
-    // }, 2000);
+    setTimeout(() => {
+      this.messageHandler({
+        data: { type: 'AUTH_COMPLETION', status: 'success' },
+        origin: new URL(this.apiConfig.oauthUrl).origin,
+      });
+    }, 2000);
   },
   destroyed() {
     window.removeEventListener('message', this.messageHandler);

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Daniele Rossetti

Merge request reports