diff --git a/e2e/various-suite/exemplars.spec.ts b/e2e/various-suite/exemplars.spec.ts index e1369f38908..0577b6c5add 100644 --- a/e2e/various-suite/exemplars.spec.ts +++ b/e2e/various-suite/exemplars.spec.ts @@ -1,5 +1,4 @@ import { e2e } from '@grafana/e2e'; -import { selectors } from '@grafana/e2e-selectors'; const dataSourceName = 'PromExemplar'; const addDataSource = () => { diff --git a/packages/grafana-e2e/cypress/fixtures/tempo-response.json b/packages/grafana-e2e/cypress/fixtures/tempo-response.json index 52c278c9bfa..30136a226a5 100644 --- a/packages/grafana-e2e/cypress/fixtures/tempo-response.json +++ b/packages/grafana-e2e/cypress/fixtures/tempo-response.json @@ -6,18 +6,80 @@ "schema": { "name": "Trace", "refId": "A", - "meta": { "preferredVisualisationType": "trace" }, + "meta": { + "preferredVisualisationType": "trace" + }, "fields": [ - { "name": "traceID", "type": "string", "typeInfo": { "frame": "string" } }, - { "name": "spanID", "type": "string", "typeInfo": { "frame": "string" } }, - { "name": "parentSpanID", "type": "string", "typeInfo": { "frame": "string" } }, - { "name": "operationName", "type": "string", "typeInfo": { "frame": "string" } }, - { "name": "serviceName", "type": "string", "typeInfo": { "frame": "string" } }, - { "name": "serviceTags", "type": "string", "typeInfo": { "frame": "string" } }, - { "name": "startTime", "type": "number", "typeInfo": { "frame": "float64" } }, - { "name": "duration", "type": "number", "typeInfo": { "frame": "float64" } }, - { "name": "logs", "type": "string", "typeInfo": { "frame": "string" } }, - { "name": "tags", "type": "string", "typeInfo": { "frame": "string" } } + { + "name": "traceID", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "spanID", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "parentSpanID", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "operationName", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "serviceName", + "type": "string", + "typeInfo": { + "frame": "string" + } + }, + { + "name": "serviceTags", + "type": "other", + "typeInfo": { + "frame": "other" + } + }, + { + "name": "startTime", + "type": "number", + "typeInfo": { + "frame": "float64" + } + }, + { + "name": "duration", + "type": "number", + "typeInfo": { + "frame": "float64" + } + }, + { + "name": "logs", + "type": "other", + "typeInfo": { + "frame": "other" + } + }, + { + "name": "tags", + "type": "other", + "typeInfo": { + "frame": "other" + } + } ] }, "data": { @@ -49,7 +111,7 @@ "7554371986156978275" ], [ - "", + null, "4829080550953998599", "2017565205134657253", "8342878680821632593", @@ -76,57 +138,1039 @@ ], ["lb", "lb", "app", "app", "app", "db", "lb", "app", "app", "app", "db"], [ - "[{\"value\":\"lb\",\"key\":\"service.name\"},{\"value\":\"tns/loadgen\",\"key\":\"job\"},{\"value\":\"Jaeger-Go-2.22.1\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"f55ab7e317a6\",\"key\":\"host.name\"},{\"value\":\"172.24.0.8\",\"key\":\"ip\"},{\"value\":\"36042b5ca9f81d60\",\"key\":\"client-uuid\"}]", - "[{\"value\":\"lb\",\"key\":\"service.name\"},{\"value\":\"tns/loadgen\",\"key\":\"job\"},{\"value\":\"Jaeger-Go-2.22.1\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"f55ab7e317a6\",\"key\":\"host.name\"},{\"value\":\"172.24.0.8\",\"key\":\"ip\"},{\"value\":\"36042b5ca9f81d60\",\"key\":\"client-uuid\"}]", - "[{\"value\":\"app\",\"key\":\"service.name\"},{\"value\":\"tns/app\",\"key\":\"job\"},{\"value\":\"Jaeger-Go-2.22.1\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"7945a05e75db\",\"key\":\"host.name\"},{\"value\":\"172.24.0.7\",\"key\":\"ip\"},{\"value\":\"78f645af1e60163d\",\"key\":\"client-uuid\"}]", - "[{\"value\":\"app\",\"key\":\"service.name\"},{\"value\":\"tns/app\",\"key\":\"job\"},{\"value\":\"Jaeger-Go-2.22.1\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"7945a05e75db\",\"key\":\"host.name\"},{\"value\":\"172.24.0.7\",\"key\":\"ip\"},{\"value\":\"78f645af1e60163d\",\"key\":\"client-uuid\"}]", - "[{\"value\":\"app\",\"key\":\"service.name\"},{\"value\":\"tns/app\",\"key\":\"job\"},{\"value\":\"Jaeger-Go-2.22.1\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"7945a05e75db\",\"key\":\"host.name\"},{\"value\":\"172.24.0.7\",\"key\":\"ip\"},{\"value\":\"78f645af1e60163d\",\"key\":\"client-uuid\"}]", - "[{\"value\":\"db\",\"key\":\"service.name\"},{\"value\":\"tns/db\",\"key\":\"job\"},{\"value\":\"Jaeger-Go-2.22.1\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"aae464791221\",\"key\":\"host.name\"},{\"value\":\"172.24.0.2\",\"key\":\"ip\"},{\"value\":\"18b1a6b5278dd643\",\"key\":\"client-uuid\"}]", - "[{\"value\":\"lb\",\"key\":\"service.name\"},{\"value\":\"tns/loadgen\",\"key\":\"job\"},{\"value\":\"Jaeger-Go-2.22.1\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"f55ab7e317a6\",\"key\":\"host.name\"},{\"value\":\"172.24.0.8\",\"key\":\"ip\"},{\"value\":\"36042b5ca9f81d60\",\"key\":\"client-uuid\"}]", - "[{\"value\":\"app\",\"key\":\"service.name\"},{\"value\":\"tns/app\",\"key\":\"job\"},{\"value\":\"Jaeger-Go-2.22.1\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"7945a05e75db\",\"key\":\"host.name\"},{\"value\":\"172.24.0.7\",\"key\":\"ip\"},{\"value\":\"78f645af1e60163d\",\"key\":\"client-uuid\"}]", - "[{\"value\":\"app\",\"key\":\"service.name\"},{\"value\":\"tns/app\",\"key\":\"job\"},{\"value\":\"Jaeger-Go-2.22.1\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"7945a05e75db\",\"key\":\"host.name\"},{\"value\":\"172.24.0.7\",\"key\":\"ip\"},{\"value\":\"78f645af1e60163d\",\"key\":\"client-uuid\"}]", - "[{\"value\":\"app\",\"key\":\"service.name\"},{\"value\":\"tns/app\",\"key\":\"job\"},{\"value\":\"Jaeger-Go-2.22.1\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"7945a05e75db\",\"key\":\"host.name\"},{\"value\":\"172.24.0.7\",\"key\":\"ip\"},{\"value\":\"78f645af1e60163d\",\"key\":\"client-uuid\"}]", - "[{\"value\":\"db\",\"key\":\"service.name\"},{\"value\":\"tns/db\",\"key\":\"job\"},{\"value\":\"Jaeger-Go-2.22.1\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"aae464791221\",\"key\":\"host.name\"},{\"value\":\"172.24.0.2\",\"key\":\"ip\"},{\"value\":\"18b1a6b5278dd643\",\"key\":\"client-uuid\"}]" + [ + { + "value": "lb", + "key": "service.name" + }, + { + "value": "tns/loadgen", + "key": "job" + }, + { + "value": "Jaeger-Go-2.22.1", + "key": "opencensus.exporterversion" + }, + { + "value": "f55ab7e317a6", + "key": "host.name" + }, + { + "value": "172.24.0.8", + "key": "ip" + }, + { + "value": "36042b5ca9f81d60", + "key": "client-uuid" + } + ], + [ + { + "value": "lb", + "key": "service.name" + }, + { + "value": "tns/loadgen", + "key": "job" + }, + { + "value": "Jaeger-Go-2.22.1", + "key": "opencensus.exporterversion" + }, + { + "value": "f55ab7e317a6", + "key": "host.name" + }, + { + "value": "172.24.0.8", + "key": "ip" + }, + { + "value": "36042b5ca9f81d60", + "key": "client-uuid" + } + ], + [ + { + "value": "app", + "key": "service.name" + }, + { + "value": "tns/app", + "key": "job" + }, + { + "value": "Jaeger-Go-2.22.1", + "key": "opencensus.exporterversion" + }, + { + "value": "7945a05e75db", + "key": "host.name" + }, + { + "value": "172.24.0.7", + "key": "ip" + }, + { + "value": "78f645af1e60163d", + "key": "client-uuid" + } + ], + [ + { + "value": "app", + "key": "service.name" + }, + { + "value": "tns/app", + "key": "job" + }, + { + "value": "Jaeger-Go-2.22.1", + "key": "opencensus.exporterversion" + }, + { + "value": "7945a05e75db", + "key": "host.name" + }, + { + "value": "172.24.0.7", + "key": "ip" + }, + { + "value": "78f645af1e60163d", + "key": "client-uuid" + } + ], + [ + { + "value": "app", + "key": "service.name" + }, + { + "value": "tns/app", + "key": "job" + }, + { + "value": "Jaeger-Go-2.22.1", + "key": "opencensus.exporterversion" + }, + { + "value": "7945a05e75db", + "key": "host.name" + }, + { + "value": "172.24.0.7", + "key": "ip" + }, + { + "value": "78f645af1e60163d", + "key": "client-uuid" + } + ], + [ + { + "value": "db", + "key": "service.name" + }, + { + "value": "tns/db", + "key": "job" + }, + { + "value": "Jaeger-Go-2.22.1", + "key": "opencensus.exporterversion" + }, + { + "value": "aae464791221", + "key": "host.name" + }, + { + "value": "172.24.0.2", + "key": "ip" + }, + { + "value": "18b1a6b5278dd643", + "key": "client-uuid" + } + ], + [ + { + "value": "lb", + "key": "service.name" + }, + { + "value": "tns/loadgen", + "key": "job" + }, + { + "value": "Jaeger-Go-2.22.1", + "key": "opencensus.exporterversion" + }, + { + "value": "f55ab7e317a6", + "key": "host.name" + }, + { + "value": "172.24.0.8", + "key": "ip" + }, + { + "value": "36042b5ca9f81d60", + "key": "client-uuid" + } + ], + [ + { + "value": "app", + "key": "service.name" + }, + { + "value": "tns/app", + "key": "job" + }, + { + "value": "Jaeger-Go-2.22.1", + "key": "opencensus.exporterversion" + }, + { + "value": "7945a05e75db", + "key": "host.name" + }, + { + "value": "172.24.0.7", + "key": "ip" + }, + { + "value": "78f645af1e60163d", + "key": "client-uuid" + } + ], + [ + { + "value": "app", + "key": "service.name" + }, + { + "value": "tns/app", + "key": "job" + }, + { + "value": "Jaeger-Go-2.22.1", + "key": "opencensus.exporterversion" + }, + { + "value": "7945a05e75db", + "key": "host.name" + }, + { + "value": "172.24.0.7", + "key": "ip" + }, + { + "value": "78f645af1e60163d", + "key": "client-uuid" + } + ], + [ + { + "value": "app", + "key": "service.name" + }, + { + "value": "tns/app", + "key": "job" + }, + { + "value": "Jaeger-Go-2.22.1", + "key": "opencensus.exporterversion" + }, + { + "value": "7945a05e75db", + "key": "host.name" + }, + { + "value": "172.24.0.7", + "key": "ip" + }, + { + "value": "78f645af1e60163d", + "key": "client-uuid" + } + ], + [ + { + "value": "db", + "key": "service.name" + }, + { + "value": "tns/db", + "key": "job" + }, + { + "value": "Jaeger-Go-2.22.1", + "key": "opencensus.exporterversion" + }, + { + "value": "aae464791221", + "key": "host.name" + }, + { + "value": "172.24.0.2", + "key": "ip" + }, + { + "value": "18b1a6b5278dd643", + "key": "client-uuid" + } + ] ], [ - 1620761543730.354, - 1620761543730.3628, - 1620761543732.044, - 1620761543732.163, - 1620761543732.191, - 1620761543733.925, - 1620761543735.194, - 1620761543738.197, - 1620761543738.394, - 1620761543738.398, + 1620761543730.354, 1620761543730.3628, 1620761543732.044, 1620761543732.163, 1620761543732.191, + 1620761543733.925, 1620761543735.194, 1620761543738.197, 1620761543738.394, 1620761543738.398, 1620761543744.6929 ], [17.826, 4.824, 2.588, 2.403, 2.401, 0.142, 13.266, 11.281, 8.593, 10.87, 0.136], [ - "", - "[{\"timestamp\":1620761543730.414,\"fields\":[{\"value\":\"GetConn\",\"key\":\"event\"}]},{\"timestamp\":1620761543730.475,\"fields\":[{\"value\":\"DNSStart\",\"key\":\"event\"},{\"value\":\"app\",\"key\":\"host\"}]},{\"timestamp\":1620761543731.1738,\"fields\":[{\"value\":\"DNSDone\",\"key\":\"event\"},{\"value\":\"172.24.0.7\",\"key\":\"addr\"}]},{\"timestamp\":1620761543731.184,\"fields\":[{\"value\":\"ConnectStart\",\"key\":\"event\"},{\"value\":\"tcp\",\"key\":\"network\"},{\"value\":\"172.24.0.7:80\",\"key\":\"addr\"}]},{\"timestamp\":1620761543731.6228,\"fields\":[{\"value\":\"ConnectDone\",\"key\":\"event\"},{\"value\":\"tcp\",\"key\":\"network\"},{\"value\":\"172.24.0.7:80\",\"key\":\"addr\"}]},{\"timestamp\":1620761543731.678,\"fields\":[{\"value\":\"GotConn\",\"key\":\"event\"}]},{\"timestamp\":1620761543731.737,\"fields\":[{\"value\":\"WroteHeaders\",\"key\":\"event\"}]},{\"timestamp\":1620761543731.742,\"fields\":[{\"value\":\"WroteRequest\",\"key\":\"event\"}]},{\"timestamp\":1620761543735.001,\"fields\":[{\"value\":\"GotFirstResponseByte\",\"key\":\"event\"}]},{\"timestamp\":1620761543735.186,\"fields\":[{\"value\":\"ClosedBody\",\"key\":\"event\"}]}]", - "", - "", - "[{\"timestamp\":1620761543732.209,\"fields\":[{\"value\":\"GetConn\",\"key\":\"event\"}]},{\"timestamp\":1620761543732.236,\"fields\":[{\"value\":\"DNSStart\",\"key\":\"event\"},{\"value\":\"db\",\"key\":\"host\"}]},{\"timestamp\":1620761543733.196,\"fields\":[{\"value\":\"DNSDone\",\"key\":\"event\"},{\"value\":\"172.24.0.2\",\"key\":\"addr\"}]},{\"timestamp\":1620761543733.203,\"fields\":[{\"value\":\"ConnectStart\",\"key\":\"event\"},{\"value\":\"tcp\",\"key\":\"network\"},{\"value\":\"172.24.0.2:80\",\"key\":\"addr\"}]},{\"timestamp\":1620761543733.459,\"fields\":[{\"value\":\"ConnectDone\",\"key\":\"event\"},{\"value\":\"tcp\",\"key\":\"network\"},{\"value\":\"172.24.0.2:80\",\"key\":\"addr\"}]},{\"timestamp\":1620761543733.549,\"fields\":[{\"value\":\"GotConn\",\"key\":\"event\"}]},{\"timestamp\":1620761543733.613,\"fields\":[{\"value\":\"WroteHeaders\",\"key\":\"event\"}]},{\"timestamp\":1620761543733.618,\"fields\":[{\"value\":\"WroteRequest\",\"key\":\"event\"}]},{\"timestamp\":1620761543734.241,\"fields\":[{\"value\":\"GotFirstResponseByte\",\"key\":\"event\"}]},{\"timestamp\":1620761543734.592,\"fields\":[{\"value\":\"ClosedBody\",\"key\":\"event\"}]}]", - "", - "[{\"timestamp\":1620761543735.23,\"fields\":[{\"value\":\"GetConn\",\"key\":\"event\"}]},{\"timestamp\":1620761543735.277,\"fields\":[{\"value\":\"DNSStart\",\"key\":\"event\"},{\"value\":\"app\",\"key\":\"host\"}]},{\"timestamp\":1620761543736.9658,\"fields\":[{\"value\":\"DNSDone\",\"key\":\"event\"},{\"value\":\"172.24.0.7\",\"key\":\"addr\"}]},{\"timestamp\":1620761543736.9758,\"fields\":[{\"value\":\"ConnectStart\",\"key\":\"event\"},{\"value\":\"tcp\",\"key\":\"network\"},{\"value\":\"172.24.0.7:80\",\"key\":\"addr\"}]},{\"timestamp\":1620761543737.705,\"fields\":[{\"value\":\"ConnectDone\",\"key\":\"event\"},{\"value\":\"tcp\",\"key\":\"network\"},{\"value\":\"172.24.0.7:80\",\"key\":\"addr\"}]},{\"timestamp\":1620761543737.773,\"fields\":[{\"value\":\"GotConn\",\"key\":\"event\"}]},{\"timestamp\":1620761543737.8098,\"fields\":[{\"value\":\"WroteHeaders\",\"key\":\"event\"}]},{\"timestamp\":1620761543737.811,\"fields\":[{\"value\":\"WroteRequest\",\"key\":\"event\"}]},{\"timestamp\":1620761543747.939,\"fields\":[{\"value\":\"GotFirstResponseByte\",\"key\":\"event\"}]},{\"timestamp\":1620761543748.46,\"fields\":[{\"value\":\"ClosedBody\",\"key\":\"event\"}]}]", - "", - "", - "[{\"timestamp\":1620761543738.446,\"fields\":[{\"value\":\"GetConn\",\"key\":\"event\"}]},{\"timestamp\":1620761543738.502,\"fields\":[{\"value\":\"DNSStart\",\"key\":\"event\"},{\"value\":\"db\",\"key\":\"host\"}]},{\"timestamp\":1620761543743.861,\"fields\":[{\"value\":\"DNSDone\",\"key\":\"event\"},{\"value\":\"172.24.0.2\",\"key\":\"addr\"}]},{\"timestamp\":1620761543743.918,\"fields\":[{\"value\":\"ConnectStart\",\"key\":\"event\"},{\"value\":\"tcp\",\"key\":\"network\"},{\"value\":\"172.24.0.2:80\",\"key\":\"addr\"}]},{\"timestamp\":1620761543744.228,\"fields\":[{\"value\":\"ConnectDone\",\"key\":\"event\"},{\"value\":\"tcp\",\"key\":\"network\"},{\"value\":\"172.24.0.2:80\",\"key\":\"addr\"}]},{\"timestamp\":1620761543744.345,\"fields\":[{\"value\":\"GotConn\",\"key\":\"event\"}]},{\"timestamp\":1620761543744.414,\"fields\":[{\"value\":\"WroteHeaders\",\"key\":\"event\"}]},{\"timestamp\":1620761543744.416,\"fields\":[{\"value\":\"WroteRequest\",\"key\":\"event\"}]},{\"timestamp\":1620761543746.825,\"fields\":[{\"value\":\"GotFirstResponseByte\",\"key\":\"event\"}]},{\"timestamp\":1620761543749.2668,\"fields\":[{\"value\":\"ClosedBody\",\"key\":\"event\"}]}]", - "" + null, + [ + { + "timestamp": 1620761543730.414, + "fields": [ + { + "value": "GetConn", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543730.475, + "fields": [ + { + "value": "DNSStart", + "key": "event" + }, + { + "value": "app", + "key": "host" + } + ] + }, + { + "timestamp": 1620761543731.1738, + "fields": [ + { + "value": "DNSDone", + "key": "event" + }, + { + "value": "172.24.0.7", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543731.184, + "fields": [ + { + "value": "ConnectStart", + "key": "event" + }, + { + "value": "tcp", + "key": "network" + }, + { + "value": "172.24.0.7: 80", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543731.6228, + "fields": [ + { + "value": "ConnectDone", + "key": "event" + }, + { + "value": "tcp", + "key": "network" + }, + { + "value": "172.24.0.7: 80", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543731.678, + "fields": [ + { + "value": "GotConn", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543731.737, + "fields": [ + { + "value": "WroteHeaders", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543731.742, + "fields": [ + { + "value": "WroteRequest", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543735.001, + "fields": [ + { + "value": "GotFirstResponseByte", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543735.186, + "fields": [ + { + "value": "ClosedBody", + "key": "event" + } + ] + } + ], + null, + null, + [ + { + "timestamp": 1620761543732.209, + "fields": [ + { + "value": "GetConn", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543732.236, + "fields": [ + { + "value": "DNSStart", + "key": "event" + }, + { + "value": "db", + "key": "host" + } + ] + }, + { + "timestamp": 1620761543733.196, + "fields": [ + { + "value": "DNSDone", + "key": "event" + }, + { + "value": "172.24.0.2", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543733.203, + "fields": [ + { + "value": "ConnectStart", + "key": "event" + }, + { + "value": "tcp", + "key": "network" + }, + { + "value": "172.24.0.2: 80", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543733.459, + "fields": [ + { + "value": "ConnectDone", + "key": "event" + }, + { + "value": "tcp", + "key": "network" + }, + { + "value": "172.24.0.2: 80", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543733.549, + "fields": [ + { + "value": "GotConn", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543733.613, + "fields": [ + { + "value": "WroteHeaders", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543733.618, + "fields": [ + { + "value": "WroteRequest", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543734.241, + "fields": [ + { + "value": "GotFirstResponseByte", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543734.592, + "fields": [ + { + "value": "ClosedBody", + "key": "event" + } + ] + } + ], + null, + [ + { + "timestamp": 1620761543735.23, + "fields": [ + { + "value": "GetConn", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543735.277, + "fields": [ + { + "value": "DNSStart", + "key": "event" + }, + { + "value": "app", + "key": "host" + } + ] + }, + { + "timestamp": 1620761543736.9658, + "fields": [ + { + "value": "DNSDone", + "key": "event" + }, + { + "value": "172.24.0.7", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543736.9758, + "fields": [ + { + "value": "ConnectStart", + "key": "event" + }, + { + "value": "tcp", + "key": "network" + }, + { + "value": "172.24.0.7: 80", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543737.705, + "fields": [ + { + "value": "ConnectDone", + "key": "event" + }, + { + "value": "tcp", + "key": "network" + }, + { + "value": "172.24.0.7: 80", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543737.773, + "fields": [ + { + "value": "GotConn", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543737.8098, + "fields": [ + { + "value": "WroteHeaders", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543737.811, + "fields": [ + { + "value": "WroteRequest", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543747.939, + "fields": [ + { + "value": "GotFirstResponseByte", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543748.46, + "fields": [ + { + "value": "ClosedBody", + "key": "event" + } + ] + } + ], + null, + null, + [ + { + "timestamp": 1620761543738.446, + "fields": [ + { + "value": "GetConn", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543738.502, + "fields": [ + { + "value": "DNSStart", + "key": "event" + }, + { + "value": "db", + "key": "host" + } + ] + }, + { + "timestamp": 1620761543743.861, + "fields": [ + { + "value": "DNSDone", + "key": "event" + }, + { + "value": "172.24.0.2", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543743.918, + "fields": [ + { + "value": "ConnectStart", + "key": "event" + }, + { + "value": "tcp", + "key": "network" + }, + { + "value": "172.24.0.2: 80", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543744.228, + "fields": [ + { + "value": "ConnectDone", + "key": "event" + }, + { + "value": "tcp", + "key": "network" + }, + { + "value": "172.24.0.2: 80", + "key": "addr" + } + ] + }, + { + "timestamp": 1620761543744.345, + "fields": [ + { + "value": "GotConn", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543744.414, + "fields": [ + { + "value": "WroteHeaders", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543744.416, + "fields": [ + { + "value": "WroteRequest", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543746.825, + "fields": [ + { + "value": "GotFirstResponseByte", + "key": "event" + } + ] + }, + { + "timestamp": 1620761543749.2668, + "fields": [ + { + "value": "ClosedBody", + "key": "event" + } + ] + } + ], + null ], [ - "[{\"value\":\"const\",\"key\":\"sampler.type\"},{\"value\":true,\"key\":\"sampler.param\"},{\"value\":0,\"key\":\"status.code\"}]", - "[{\"value\":302,\"key\":\"http.status_code\"},{\"value\":\"net/http\",\"key\":\"component\"},{\"value\":\"POST\",\"key\":\"http.method\"},{\"value\":\"app:80\",\"key\":\"http.url\"},{\"value\":false,\"key\":\"net/http.reused\"},{\"value\":false,\"key\":\"net/http.was_idle\"},{\"value\":\"client\",\"key\":\"span.kind\"},{\"value\":0,\"key\":\"status.code\"}]", - "[{\"value\":302,\"key\":\"http.status_code\"},{\"value\":\"POST\",\"key\":\"http.method\"},{\"value\":\"/post\",\"key\":\"http.url\"},{\"value\":\"net/http\",\"key\":\"component\"},{\"value\":\"server\",\"key\":\"span.kind\"},{\"value\":0,\"key\":\"status.code\"}]", - "[{\"value\":0,\"key\":\"status.code\"}]", - "[{\"value\":204,\"key\":\"http.status_code\"},{\"value\":\"net/http\",\"key\":\"component\"},{\"value\":\"POST\",\"key\":\"http.method\"},{\"value\":\"db:80\",\"key\":\"http.url\"},{\"value\":false,\"key\":\"net/http.reused\"},{\"value\":false,\"key\":\"net/http.was_idle\"},{\"value\":\"client\",\"key\":\"span.kind\"},{\"value\":0,\"key\":\"status.code\"}]", - "[{\"value\":204,\"key\":\"http.status_code\"},{\"value\":\"POST\",\"key\":\"http.method\"},{\"value\":\"/post\",\"key\":\"http.url\"},{\"value\":\"net/http\",\"key\":\"component\"},{\"value\":\"server\",\"key\":\"span.kind\"},{\"value\":0,\"key\":\"status.code\"}]", - "[{\"value\":200,\"key\":\"http.status_code\"},{\"value\":\"net/http\",\"key\":\"component\"},{\"value\":\"GET\",\"key\":\"http.method\"},{\"value\":\"app:80\",\"key\":\"http.url\"},{\"value\":false,\"key\":\"net/http.reused\"},{\"value\":false,\"key\":\"net/http.was_idle\"},{\"value\":\"client\",\"key\":\"span.kind\"},{\"value\":0,\"key\":\"status.code\"}]", - "[{\"value\":200,\"key\":\"http.status_code\"},{\"value\":\"GET\",\"key\":\"http.method\"},{\"value\":\"/\",\"key\":\"http.url\"},{\"value\":\"net/http\",\"key\":\"component\"},{\"value\":\"server\",\"key\":\"span.kind\"},{\"value\":0,\"key\":\"status.code\"}]", - "[{\"value\":0,\"key\":\"status.code\"}]", - "[{\"value\":200,\"key\":\"http.status_code\"},{\"value\":\"net/http\",\"key\":\"component\"},{\"value\":\"GET\",\"key\":\"http.method\"},{\"value\":\"db:80\",\"key\":\"http.url\"},{\"value\":false,\"key\":\"net/http.reused\"},{\"value\":false,\"key\":\"net/http.was_idle\"},{\"value\":\"client\",\"key\":\"span.kind\"},{\"value\":0,\"key\":\"status.code\"}]", - "[{\"value\":200,\"key\":\"http.status_code\"},{\"value\":\"GET\",\"key\":\"http.method\"},{\"value\":\"/\",\"key\":\"http.url\"},{\"value\":\"net/http\",\"key\":\"component\"},{\"value\":\"server\",\"key\":\"span.kind\"},{\"value\":0,\"key\":\"status.code\"}]" + [ + { + "value": "const", + "key": "sampler.type" + }, + { + "value": true, + "key": "sampler.param" + }, + { + "value": 0, + "key": "status.code" + } + ], + [ + { + "value": 302, + "key": "http.status_code" + }, + { + "value": "net/http", + "key": "component" + }, + { + "value": "POST", + "key": "http.method" + }, + { + "value": "app: 80", + "key": "http.url" + }, + { + "value": false, + "key": "net/http.reused" + }, + { + "value": false, + "key": "net/http.was_idle" + }, + { + "value": "client", + "key": "span.kind" + }, + { + "value": 0, + "key": "status.code" + } + ], + [ + { + "value": 302, + "key": "http.status_code" + }, + { + "value": "POST", + "key": "http.method" + }, + { + "value": "/post", + "key": "http.url" + }, + { + "value": "net/http", + "key": "component" + }, + { + "value": "server", + "key": "span.kind" + }, + { + "value": 0, + "key": "status.code" + } + ], + [ + { + "value": 0, + "key": "status.code" + } + ], + [ + { + "value": 204, + "key": "http.status_code" + }, + { + "value": "net/http", + "key": "component" + }, + { + "value": "POST", + "key": "http.method" + }, + { + "value": "db: 80", + "key": "http.url" + }, + { + "value": false, + "key": "net/http.reused" + }, + { + "value": false, + "key": "net/http.was_idle" + }, + { + "value": "client", + "key": "span.kind" + }, + { + "value": 0, + "key": "status.code" + } + ], + [ + { + "value": 204, + "key": "http.status_code" + }, + { + "value": "POST", + "key": "http.method" + }, + { + "value": "/post", + "key": "http.url" + }, + { + "value": "net/http", + "key": "component" + }, + { + "value": "server", + "key": "span.kind" + }, + { + "value": 0, + "key": "status.code" + } + ], + [ + { + "value": 200, + "key": "http.status_code" + }, + { + "value": "net/http", + "key": "component" + }, + { + "value": "GET", + "key": "http.method" + }, + { + "value": "app: 80", + "key": "http.url" + }, + { + "value": false, + "key": "net/http.reused" + }, + { + "value": false, + "key": "net/http.was_idle" + }, + { + "value": "client", + "key": "span.kind" + }, + { + "value": 0, + "key": "status.code" + } + ], + [ + { + "value": 200, + "key": "http.status_code" + }, + { + "value": "GET", + "key": "http.method" + }, + { + "value": "/", + "key": "http.url" + }, + { + "value": "net/http", + "key": "component" + }, + { + "value": "server", + "key": "span.kind" + }, + { + "value": 0, + "key": "status.code" + } + ], + [ + { + "value": 0, + "key": "status.code" + } + ], + [ + { + "value": 200, + "key": "http.status_code" + }, + { + "value": "net/http", + "key": "component" + }, + { + "value": "GET", + "key": "http.method" + }, + { + "value": "db: 80", + "key": "http.url" + }, + { + "value": false, + "key": "net/http.reused" + }, + { + "value": false, + "key": "net/http.was_idle" + }, + { + "value": "client", + "key": "span.kind" + }, + { + "value": 0, + "key": "status.code" + } + ], + [ + { + "value": 200, + "key": "http.status_code" + }, + { + "value": "GET", + "key": "http.method" + }, + { + "value": "/", + "key": "http.url" + }, + { + "value": "net/http", + "key": "component" + }, + { + "value": "server", + "key": "span.kind" + }, + { + "value": 0, + "key": "status.code" + } + ] ] ] } diff --git a/pkg/tsdb/tempo/trace_transform.go b/pkg/tsdb/tempo/trace_transform.go index 2b191dc59c1..1b390833d6f 100644 --- a/pkg/tsdb/tempo/trace_transform.go +++ b/pkg/tsdb/tempo/trace_transform.go @@ -46,12 +46,12 @@ func TraceToFrame(td pdata.Traces) (*data.Frame, error) { data.NewField("parentSpanID", nil, []string{}), data.NewField("operationName", nil, []string{}), data.NewField("serviceName", nil, []string{}), - data.NewField("serviceTags", nil, []string{}), + data.NewField("serviceTags", nil, []json.RawMessage{}), data.NewField("startTime", nil, []float64{}), data.NewField("duration", nil, []float64{}), - data.NewField("logs", nil, []string{}), - data.NewField("references", nil, []string{}), - data.NewField("tags", nil, []string{}), + data.NewField("logs", nil, []json.RawMessage{}), + data.NewField("references", nil, []json.RawMessage{}), + data.NewField("tags", nil, []json.RawMessage{}), }, Meta: &data.FrameMeta{ // TODO: use constant once available in the SDK @@ -147,23 +147,15 @@ func spanToSpanRow(span pdata.Span, libraryTags pdata.InstrumentationLibrary, re parentSpanID, span.Name(), serviceName, - toJSONString(serviceTagsJson), + json.RawMessage(serviceTagsJson), startTime, float64(span.EndTimestamp()-span.StartTimestamp()) / 1_000_000, - toJSONString(logs), - toJSONString(references), - toJSONString(spanTags), + json.RawMessage(logs), + json.RawMessage(references), + json.RawMessage(spanTags), }, nil } -func toJSONString(json []byte) string { - s := string(json) - if s == "null" { - return "" - } - return s -} - func resourceToProcess(resource pdata.Resource) (string, []*KeyValue) { attrs := resource.Attributes() serviceName := tracetranslator.ResourceNoServiceName diff --git a/pkg/tsdb/tempo/trace_transform_test.go b/pkg/tsdb/tempo/trace_transform_test.go index 0ee461a0b5e..84d212fd9da 100644 --- a/pkg/tsdb/tempo/trace_transform_test.go +++ b/pkg/tsdb/tempo/trace_transform_test.go @@ -1,6 +1,7 @@ package tempo import ( + "encoding/json" "io/ioutil" "testing" @@ -34,21 +35,21 @@ func TestTraceToFrame(t *testing.T) { require.Equal(t, "HTTP GET - loki_api_v1_query_range", root["operationName"]) require.Equal(t, "loki-all", root["serviceName"]) - require.Equal(t, "[{\"value\":\"loki-all\",\"key\":\"service.name\"},{\"value\":\"Jaeger-Go-2.25.0\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"4d019a031941\",\"key\":\"host.hostname\"},{\"value\":\"172.18.0.6\",\"key\":\"ip\"},{\"value\":\"4b19ace06df8e4de\",\"key\":\"client-uuid\"}]", root["serviceTags"]) + require.Equal(t, json.RawMessage("[{\"value\":\"loki-all\",\"key\":\"service.name\"},{\"value\":\"Jaeger-Go-2.25.0\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"4d019a031941\",\"key\":\"host.hostname\"},{\"value\":\"172.18.0.6\",\"key\":\"ip\"},{\"value\":\"4b19ace06df8e4de\",\"key\":\"client-uuid\"}]"), root["serviceTags"]) require.Equal(t, 1616072924070.497, root["startTime"]) require.Equal(t, 8.421, root["duration"]) - require.Equal(t, "", root["logs"]) - require.Equal(t, "[{\"value\":\"const\",\"key\":\"sampler.type\"},{\"value\":true,\"key\":\"sampler.param\"},{\"value\":200,\"key\":\"http.status_code\"},{\"value\":\"GET\",\"key\":\"http.method\"},{\"value\":\"/loki/api/v1/query_range?direction=BACKWARD\\u0026limit=1000\\u0026query=%7Bcompose_project%3D%22devenv%22%7D%20%7C%3D%22traceID%22\\u0026start=1616070921000000000\\u0026end=1616072722000000000\\u0026step=2\",\"key\":\"http.url\"},{\"value\":\"net/http\",\"key\":\"component\"},{\"value\":\"server\",\"key\":\"span.kind\"},{\"value\":0,\"key\":\"status.code\"}]", root["tags"]) + require.Equal(t, json.RawMessage("null"), root["logs"]) + require.Equal(t, json.RawMessage("[{\"value\":\"const\",\"key\":\"sampler.type\"},{\"value\":true,\"key\":\"sampler.param\"},{\"value\":200,\"key\":\"http.status_code\"},{\"value\":\"GET\",\"key\":\"http.method\"},{\"value\":\"/loki/api/v1/query_range?direction=BACKWARD\\u0026limit=1000\\u0026query=%7Bcompose_project%3D%22devenv%22%7D%20%7C%3D%22traceID%22\\u0026start=1616070921000000000\\u0026end=1616072722000000000\\u0026step=2\",\"key\":\"http.url\"},{\"value\":\"net/http\",\"key\":\"component\"},{\"value\":\"server\",\"key\":\"span.kind\"},{\"value\":0,\"key\":\"status.code\"}]"), root["tags"]) span := bFrame.FindRowWithValue("spanID", "7198307df9748606") require.Equal(t, "GetParallelChunks", span["operationName"]) require.Equal(t, "loki-all", span["serviceName"]) - require.Equal(t, "[{\"value\":\"loki-all\",\"key\":\"service.name\"},{\"value\":\"Jaeger-Go-2.25.0\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"4d019a031941\",\"key\":\"host.hostname\"},{\"value\":\"172.18.0.6\",\"key\":\"ip\"},{\"value\":\"4b19ace06df8e4de\",\"key\":\"client-uuid\"}]", span["serviceTags"]) + require.Equal(t, json.RawMessage("[{\"value\":\"loki-all\",\"key\":\"service.name\"},{\"value\":\"Jaeger-Go-2.25.0\",\"key\":\"opencensus.exporterversion\"},{\"value\":\"4d019a031941\",\"key\":\"host.hostname\"},{\"value\":\"172.18.0.6\",\"key\":\"ip\"},{\"value\":\"4b19ace06df8e4de\",\"key\":\"client-uuid\"}]"), span["serviceTags"]) require.Equal(t, 1616072924072.852, span["startTime"]) require.Equal(t, 0.094, span["duration"]) - require.Equal(t, "[{\"timestamp\":1616072924072.856,\"fields\":[{\"value\":1,\"key\":\"chunks requested\"}]},{\"timestamp\":1616072924072.9448,\"fields\":[{\"value\":1,\"key\":\"chunks fetched\"}]}]", span["logs"]) - require.Equal(t, "[{\"value\":0,\"key\":\"status.code\"}]", span["tags"]) + require.Equal(t, json.RawMessage("[{\"timestamp\":1616072924072.856,\"fields\":[{\"value\":1,\"key\":\"chunks requested\"}]},{\"timestamp\":1616072924072.9448,\"fields\":[{\"value\":1,\"key\":\"chunks fetched\"}]}]"), span["logs"]) + require.Equal(t, json.RawMessage("[{\"value\":0,\"key\":\"status.code\"}]"), span["tags"]) }) } diff --git a/public/app/plugins/datasource/tempo/datasource.test.ts b/public/app/plugins/datasource/tempo/datasource.test.ts index 081f1c88a33..6cbfc3d5963 100644 --- a/public/app/plugins/datasource/tempo/datasource.test.ts +++ b/public/app/plugins/datasource/tempo/datasource.test.ts @@ -117,9 +117,9 @@ describe('Tempo data source', () => { { name: 'operationName', values: ['store.validateQueryTimeRange'] }, { name: 'startTime', values: [1619712655875.4539] }, { name: 'duration', values: [14.984] }, - { name: 'serviceTags', values: ['{"key":"servicetag1","value":"service"}'] }, - { name: 'logs', values: ['{"timestamp":12345,"fields":[{"key":"count","value":1}]}'] }, - { name: 'tags', values: ['{"key":"tag1","value":"val1"}'] }, + { name: 'serviceTags', values: [{ key: 'servicetag1', value: 'service' }] }, + { name: 'logs', values: [{ timestamp: 12345, fields: [{ key: 'count', value: 1 }] }] }, + { name: 'tags', values: [{ key: 'tag1', value: 'val1' }] }, { name: 'serviceName', values: ['service'] }, ], }) diff --git a/public/app/plugins/datasource/tempo/resultTransformer.test.ts b/public/app/plugins/datasource/tempo/resultTransformer.test.ts index 7a0e85b6f5c..b07acc19514 100644 --- a/public/app/plugins/datasource/tempo/resultTransformer.test.ts +++ b/public/app/plugins/datasource/tempo/resultTransformer.test.ts @@ -1,20 +1,12 @@ import { collectorTypes } from '@opentelemetry/exporter-collector'; -import { - ArrayVector, - FieldType, - MutableDataFrame, - PluginType, - DataSourceInstanceSettings, - dateTime, -} from '@grafana/data'; +import { FieldType, MutableDataFrame, PluginType, DataSourceInstanceSettings, dateTime } from '@grafana/data'; import { SearchResponse, createTableFrame, transformToOTLP, transformFromOTLP, - transformTrace, createTableFrameFromSearch, } from './resultTransformer'; import { @@ -154,42 +146,3 @@ describe('transformFromOTLP()', () => { }).not.toBeFalsy(); }); }); - -describe('transformTrace()', () => { - // Mock the console error so that running the test suite doesnt throw the error - const origError = console.error; - const consoleErrorMock = jest.fn(); - afterEach(() => (console.error = origError)); - beforeEach(() => (console.error = consoleErrorMock)); - - const badFrame = new MutableDataFrame({ - fields: [ - { - name: 'serviceTags', - values: new ArrayVector([undefined]), - }, - ], - }); - - const goodFrame = new MutableDataFrame({ - fields: [ - { - name: 'serviceTags', - values: new ArrayVector(), - }, - ], - }); - - test('if passed bad data, will surface an error', () => { - const response = transformTrace({ data: [badFrame] }, false); - expect(response.data[0]).toBeFalsy(); - expect(response.error?.message).toBeTruthy(); - }); - - test('if passed good data, will parse successfully', () => { - const response2 = transformTrace({ data: [goodFrame] }, false); - expect(response2.data[0]).toBeTruthy(); - expect(response2.data[0]).toMatchObject(goodFrame); - expect(response2.error).toBeFalsy(); - }); -}); diff --git a/public/app/plugins/datasource/tempo/resultTransformer.ts b/public/app/plugins/datasource/tempo/resultTransformer.ts index 74e385f1e92..1b4dc47e26a 100644 --- a/public/app/plugins/datasource/tempo/resultTransformer.ts +++ b/public/app/plugins/datasource/tempo/resultTransformer.ts @@ -5,11 +5,9 @@ import differenceInHours from 'date-fns/differenceInHours'; import formatDistance from 'date-fns/formatDistance'; import { - ArrayVector, DataFrame, DataQueryResponse, DataSourceInstanceSettings, - Field, FieldType, MutableDataFrame, TraceKeyValuePair, @@ -534,22 +532,12 @@ function getOTLPReferences( } export function transformTrace(response: DataQueryResponse, nodeGraph = false): DataQueryResponse { - // We need to parse some of the fields which contain stringified json. - // Seems like we can't just map the values as the frame we got from backend has some default processing - // and will stringify the json back when we try to set it. So we create a new field and swap it instead. const frame: DataFrame = response.data[0]; if (!frame) { return emptyDataQueryResponse; } - try { - parseJsonFields(frame); - } catch (error) { - console.error(error); - return { error: { message: 'Unable to parse trace response: ' + error }, data: [] }; - } - let data = [...response.data]; if (nodeGraph) { data.push(...createGraphFrames(frame)); @@ -561,30 +549,6 @@ export function transformTrace(response: DataQueryResponse, nodeGraph = false): }; } -/** - * Change fields which are json string into JS objects. Modifies the frame in place. - */ -function parseJsonFields(frame: DataFrame) { - for (const fieldName of ['serviceTags', 'logs', 'tags', 'references']) { - const field = frame.fields.find((f) => f.name === fieldName); - if (field) { - const fieldIndex = frame.fields.indexOf(field); - const values = new ArrayVector(); - const newField: Field = { - ...field, - values, - type: FieldType.other, - }; - - for (let i = 0; i < field.values.length; i++) { - const value = field.values.get(i); - values.set(i, value === '' ? undefined : JSON.parse(value)); - } - frame.fields[fieldIndex] = newField; - } - } -} - export type SearchResponse = { traceID: string; rootServiceName: string;