Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Instrument Otel #125

Merged
merged 44 commits into from
Jul 22, 2024
Merged

Instrument Otel #125

merged 44 commits into from
Jul 22, 2024

Conversation

louiseschmidtgen
Copy link
Contributor

@louiseschmidtgen louiseschmidtgen commented Jul 10, 2024

Description

This PR introduces otel tracing logs.

Traces

We collect traces on (get/count/create/update/delete/list/update/compact/dbsize), this includes various child traces where relevant.
When you run /hack/jaeger.sh and run k8s-dqlite with --otel=true, the traces are collected in a local jaeger instance at http://localhost:16686.

Screenshot from 2024-07-10 10-14-56

Screenshot from 2024-07-10 10-15-25

Metrics

The metric counters (get/count/create/update/delete/list/update) are written to stdout every 30 seconds.
(Limitation: Jaeger can't accept these metrics)

{
      "Name": "k8s-dqlite.get",
      "Description": "Number of get requests",
      "Unit": "",
      "Data": {
        "DataPoints": [
          {
            "Attributes": [],
            "StartTime": "2024-07-10T09:52:13.907275271+02:00",
            "Time": "2024-07-10T10:24:13.907264437+02:00",
            "Value": 1685
          }
        ],
        "Temporality": "CumulativeTemporality",
        "IsMonotonic": true

@bschimke95

Existing metrics

Side-note: Our kine layer already tracks some metrics here: http://127.0.0.1:9042/metrics:
See an example output here

Copy link
Contributor

@bschimke95 bschimke95 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some initial comments, looks good so far

pkg/kine/server/create.go Outdated Show resolved Hide resolved
pkg/kine/server/get.go Outdated Show resolved Hide resolved
pkg/kine/server/tracing.go Outdated Show resolved Hide resolved
pkg/kine/server/update.go Outdated Show resolved Hide resolved
@louiseschmidtgen louiseschmidtgen changed the title WIP: Instrument Otel Instrument Otel Jul 10, 2024
@louiseschmidtgen louiseschmidtgen marked this pull request as ready for review July 10, 2024 11:32
@louiseschmidtgen louiseschmidtgen requested a review from a team as a code owner July 10, 2024 11:32
@eaudetcobello
Copy link
Contributor

Nice work

@dimaqq
Copy link

dimaqq commented Jul 11, 2024

Fly-by comment: I've like to see some docs about where the parent span comes from, env? header field? etc. Additionally, given the distributed nature of dqlite, how spans in dlite peers may be linked to each other.

@louiseschmidtgen
Copy link
Contributor Author

louiseschmidtgen commented Jul 11, 2024

Fly-by comment: I've like to see some docs about where the parent span comes from, env? header field? etc. Additionally, given the distributed nature of dqlite, how spans in dlite peers may be linked to each other.

@dimaqq Great question!
To answer your first question, we retrieve information about the parent span from the context header fields. See otel's spanContext, they follow the W3C TraceContext Specification.

In summary, a traceparent header has the values span-id trace-id and trace-flags (sampled flag). Additionally, the tracestate header is used which allows for multiple tracing systems in a trace.

About your second question, we can created nested spans that are all associated with the same root span. If we need to inject additional information via the HTTP headers we can make use of propagators.

Copy link

github-actions bot commented Jul 12, 2024

Benchmark Result

goos: linux
goarch: amd64
pkg: github.com/canonical/k8s-dqlite/pkg/kine/drivers
cpu: AMD EPYC 7763 64-Core Processor                
                   │   Before    │
                   │   sec/op    │
DqliteCompaction-4   4.894m ± 8%
SQLiteCompaction-4   3.346m ± 3%
geomean              4.047m

                   │    Before    │
                   │     B/op     │
DqliteCompaction-4   39.91Ki ± 2%
SQLiteCompaction-4   60.96Ki ± 1%
geomean              49.32Ki

                   │   Before    │
                   │  allocs/op  │
DqliteCompaction-4   1.231k ± 2%
SQLiteCompaction-4   2.942k ± 1%
geomean              1.903k

pkg: github.com/canonical/k8s-dqlite/test
                    │   Before    │                 After                  │
                    │   sec/op    │     sec/op      vs base                │
Create/sqlite-4       1.395m ± 2%   1.391m ± 10%         ~ (p=0.535 n=7)
Create/dqlite-4       1.386m ± 6%   1.342m ±  3%    -3.18% (p=0.014 n=7+6)
Delete/sqlite-4       1.447m ± 5%   1.423m ±  3%    -1.66% (p=0.026 n=7)
Get/sqlite-4          367.7µ ± 1%   388.8µ ±  2%    +5.73% (p=0.001 n=7)
Get/dqlite-4          486.6µ ± 1%   501.7µ ±  0%    +3.10% (p=0.001 n=6+7)
Lease/sqlite-4        104.4µ ± 3%   105.2µ ±  4%         ~ (p=0.128 n=7)
Lease/dqlite-4        105.6µ ± 3%   109.2µ ±  5%         ~ (p=0.053 n=7)
List/sqlite-4         7.551m ± 5%   7.353m ±  3%         ~ (p=0.128 n=7)
List/dqlite-4         44.01m ± 0%   43.56m ±  0%    -1.01% (p=0.001 n=7)
Update/sqlite-4       1.424m ± 3%   1.394m ±  4%    -2.08% (p=0.011 n=7)
Update/dqlite-4       1.391m ± 7%   1.385m ±  2%         ~ (p=0.456 n=7)
Compaction/sqlite-4                 3.606m ±  8%
Compaction/dqlite-4                 5.080m ±  4%
Delete/dqlite-4                     1.370m ±   ∞ ¹
geomean               1.124m        1.382m          +0.13%
¹ need >= 6 samples for confidence interval at level 0.95

                    │    Before     │                  After                   │
                    │     B/op      │      B/op        vs base                 │
Create/sqlite-4        21.06Ki ± 0%    22.94Ki ± 0%     +8.94% (p=0.001 n=7)
Create/dqlite-4        18.76Ki ± 0%    20.68Ki ± 0%    +10.26% (p=0.001 n=7+6)
Delete/sqlite-4        23.00Ki ± 0%    25.63Ki ± 0%    +11.47% (p=0.001 n=7)
Get/sqlite-4           16.67Ki ± 0%    20.61Ki ± 0%    +23.63% (p=0.001 n=7)
Get/dqlite-4           15.35Ki ± 0%    18.59Ki ± 0%    +21.09% (p=0.001 n=6+7)
Lease/sqlite-4         12.33Ki ± 0%    12.33Ki ± 0%          ~ (p=0.192 n=7)
Lease/dqlite-4         12.33Ki ± 0%    12.33Ki ± 0%          ~ (p=1.000 n=7)
List/sqlite-4         1137.4Ki ± 3%   1004.9Ki ± 3%    -11.65% (p=0.001 n=7)
List/dqlite-4          76.10Ki ± 0%    76.43Ki ± 0%     +0.44% (p=0.001 n=7)
Update/sqlite-4        23.05Ki ± 0%    25.18Ki ± 0%     +9.25% (p=0.001 n=7)
Update/dqlite-4        20.01Ki ± 0%    22.18Ki ± 0%    +10.83% (p=0.001 n=7)
Compaction/sqlite-4                    72.77Ki ± 2%
Compaction/dqlite-4                    54.09Ki ± 2%
Delete/dqlite-4                        22.36Ki ±  ∞ ¹
geomean                29.39Ki         33.92Ki          +7.22%
¹ need >= 6 samples for confidence interval at level 0.95

                    │   Before    │                  After                   │
                    │  allocs/op  │   allocs/op    vs base                   │
Create/sqlite-4        501.0 ± 0%    526.0 ± 0%     +4.99% (p=0.001 n=7)
Create/dqlite-4        365.0 ± 0%    388.5 ± 0%     +6.44% (p=0.001 n=7+6)
Delete/sqlite-4        571.0 ± 0%    626.0 ± 0%     +9.63% (p=0.001 n=7)
Get/sqlite-4           386.0 ± 0%    499.0 ± 0%    +29.27% (p=0.001 n=7)
Get/dqlite-4           291.0 ± 0%    354.0 ± 0%    +21.65% (p=0.001 n=6+7)
Lease/sqlite-4         224.0 ± 0%    224.0 ± 0%          ~ (p=1.000 n=7)   ¹
Lease/dqlite-4         224.0 ± 0%    224.0 ± 0%          ~ (p=1.000 n=7)   ¹
List/sqlite-4         45.63k ± 4%   40.83k ± 3%    -10.51% (p=0.001 n=7)
List/dqlite-4         1.723k ± 0%   1.699k ± 0%     -1.39% (p=0.001 n=7)
Update/sqlite-4        579.0 ± 0%    603.0 ± 0%     +4.15% (p=0.001 n=7)
Update/dqlite-4        388.0 ± 0%    409.0 ± 0%     +5.41% (p=0.001 n=7)
Compaction/sqlite-4                 3.224k ± 2%
Compaction/dqlite-4                 1.490k ± 2%
Delete/dqlite-4                      412.0 ±  ∞ ²
geomean                660.2         792.3          +5.84%
¹ all samples are equal
² need >= 6 samples for confidence interval at level 0.95

                    │        After         │
                    │ page-cache-misses/op │
Create/sqlite-4               0.000 ± 0%
Create/dqlite-4               0.000 ± 0%
Delete/sqlite-4               0.000 ± 0%
Get/sqlite-4                  0.000 ± 0%
Get/dqlite-4                  0.000 ± 0%
Lease/sqlite-4                0.000 ± 0%
Lease/dqlite-4                0.000 ± 0%
List/sqlite-4                 0.000 ± 0%
List/dqlite-4                 0.000 ± 0%
Update/sqlite-4               0.000 ± 0%
Update/dqlite-4               0.000 ± 0%
Compaction/sqlite-4           0.000 ± 0%
Compaction/dqlite-4           0.000 ± 0%
Delete/dqlite-4               0.000 ±  ∞ ¹
geomean                                  ²
¹ need >= 6 samples for confidence interval at level 0.95
² summaries must be >0 to compute geomean

                    │        After         │
                    │ page-cache-spills/op │
Create/sqlite-4               0.000 ± 0%
Create/dqlite-4               0.000 ± 0%
Delete/sqlite-4               0.000 ± 0%
Get/sqlite-4                  0.000 ± 0%
Get/dqlite-4                  0.000 ± 0%
Lease/sqlite-4                0.000 ± 0%
Lease/dqlite-4                0.000 ± 0%
List/sqlite-4                 0.000 ± 0%
List/dqlite-4                 0.000 ± 0%
Update/sqlite-4               0.000 ± 0%
Update/dqlite-4               0.000 ± 0%
Compaction/sqlite-4           0.000 ± 0%
Compaction/dqlite-4           0.000 ± 0%
Delete/dqlite-4               0.000 ±  ∞ ¹
geomean                                  ²
¹ need >= 6 samples for confidence interval at level 0.95
² summaries must be >0 to compute geomean

                    │     After      │
                    │ page-reads/op  │
Create/sqlite-4        21.32 ±  1%
Create/dqlite-4        18.17 ±  1%
Delete/sqlite-4        25.17 ±  0%
Get/sqlite-4           11.99 ±  0%
Get/dqlite-4           11.99 ±  0%
Lease/sqlite-4        800.0µ ± 50%
Lease/dqlite-4        835.9µ ± 44%
List/sqlite-4          268.0 ±  4%
List/dqlite-4          34.03 ±  0%
Update/sqlite-4        25.19 ±  2%
Update/dqlite-4        20.26 ±  1%
Compaction/sqlite-4    107.8 ±  1%
Compaction/dqlite-4    118.4 ±  1%
Delete/dqlite-4        21.23 ±   ∞ ¹
geomean                7.284
¹ need >= 6 samples for confidence interval at level 0.95

                    │     After      │
                    │ page-writes/op │
Create/sqlite-4         5.111 ± 1%
Create/dqlite-4         4.146 ± 1%
Delete/sqlite-4         5.289 ± 1%
Get/sqlite-4            0.000 ± 0%
Get/dqlite-4            0.000 ± 0%
Lease/sqlite-4          0.000 ± 0%
Lease/dqlite-4          0.000 ± 0%
List/sqlite-4           0.000 ± 0%
List/dqlite-4           0.000 ± 0%
Update/sqlite-4         5.141 ± 0%
Update/dqlite-4         4.158 ± 0%
Compaction/sqlite-4     11.24 ± 0%
Compaction/dqlite-4     8.271 ± 0%
Delete/dqlite-4         4.313 ±  ∞ ¹
geomean                            ²
¹ need >= 6 samples for confidence interval at level 0.95
² summaries must be >0 to compute geomean

                    │     After      │
                    │ sec-reading/op │
Create/sqlite-4       98.50µ ± 19%
Create/dqlite-4       40.95µ ± 26%
Delete/sqlite-4       164.2µ ±  9%
Get/sqlite-4          86.20µ ±  6%
Get/dqlite-4          34.50µ ± 17%
Lease/sqlite-4         0.000 ±   ?
Lease/dqlite-4         0.000 ±  0%
List/sqlite-4         6.668m ±  4%
List/dqlite-4         210.0µ ± 48%
Update/sqlite-4       164.8µ ±  6%
Update/dqlite-4       97.90µ ± 11%
Compaction/sqlite-4   673.8µ ± 59%
Compaction/dqlite-4   182.8µ ± 22%
Delete/dqlite-4       55.90µ ±   ∞ ¹
geomean                            ²
¹ need >= 6 samples for confidence interval at level 0.95
² summaries must be >0 to compute geomean

                    │     After      │
                    │ sec-writing/op │
Create/sqlite-4       909.8µ ± 14%
Create/dqlite-4       21.85µ ± 48%
Delete/sqlite-4       928.8µ ±  4%
Get/sqlite-4           0.000 ±  0%
Get/dqlite-4           0.000 ±  0%
Lease/sqlite-4         0.000 ±  0%
Lease/dqlite-4         0.000 ±  0%
List/sqlite-4          0.000 ±  0%
List/dqlite-4          0.000 ±  0%
Update/sqlite-4       862.6µ ±  6%
Update/dqlite-4       25.20µ ± 35%
Compaction/sqlite-4   2.587m ± 11%
Compaction/dqlite-4   54.15µ ± 63%
Delete/dqlite-4       21.10µ ±   ∞ ¹
geomean                            ²
¹ need >= 6 samples for confidence interval at level 0.95
² summaries must be >0 to compute geomean
Current status
goos: linux
goarch: amd64
pkg: github.com/canonical/k8s-dqlite/test
cpu: AMD EPYC 7763 64-Core Processor                
                    │     After      │
                    │     sec/op     │
Compaction/sqlite-4   3.606m ±  8%
Compaction/dqlite-4   5.080m ±  4%
Create/sqlite-4       1.391m ± 10%
Create/dqlite-4       1.342m ±  3%
Delete/sqlite-4       1.423m ±  3%
Delete/dqlite-4       1.370m ±   ∞ ¹
Get/sqlite-4          388.8µ ±  2%
Get/dqlite-4          501.7µ ±  0%
Lease/sqlite-4        105.2µ ±  4%
Lease/dqlite-4        109.2µ ±  5%
List/sqlite-4         7.353m ±  3%
List/dqlite-4         43.56m ±  0%
Update/sqlite-4       1.394m ±  4%
Update/dqlite-4       1.385m ±  2%
geomean               1.382m
¹ need >= 6 samples for confidence interval at level 0.95

                    │        After         │
                    │ page-cache-misses/op │
Compaction/sqlite-4           0.000 ± 0%
Compaction/dqlite-4           0.000 ± 0%
Create/sqlite-4               0.000 ± 0%
Create/dqlite-4               0.000 ± 0%
Delete/sqlite-4               0.000 ± 0%
Delete/dqlite-4               0.000 ±  ∞ ¹
Get/sqlite-4                  0.000 ± 0%
Get/dqlite-4                  0.000 ± 0%
Lease/sqlite-4                0.000 ± 0%
Lease/dqlite-4                0.000 ± 0%
List/sqlite-4                 0.000 ± 0%
List/dqlite-4                 0.000 ± 0%
Update/sqlite-4               0.000 ± 0%
Update/dqlite-4               0.000 ± 0%
geomean                                  ²
¹ need >= 6 samples for confidence interval at level 0.95
² summaries must be >0 to compute geomean

                    │        After         │
                    │ page-cache-spills/op │
Compaction/sqlite-4           0.000 ± 0%
Compaction/dqlite-4           0.000 ± 0%
Create/sqlite-4               0.000 ± 0%
Create/dqlite-4               0.000 ± 0%
Delete/sqlite-4               0.000 ± 0%
Delete/dqlite-4               0.000 ±  ∞ ¹
Get/sqlite-4                  0.000 ± 0%
Get/dqlite-4                  0.000 ± 0%
Lease/sqlite-4                0.000 ± 0%
Lease/dqlite-4                0.000 ± 0%
List/sqlite-4                 0.000 ± 0%
List/dqlite-4                 0.000 ± 0%
Update/sqlite-4               0.000 ± 0%
Update/dqlite-4               0.000 ± 0%
geomean                                  ²
¹ need >= 6 samples for confidence interval at level 0.95
² summaries must be >0 to compute geomean

                    │     After      │
                    │ page-reads/op  │
Compaction/sqlite-4    107.8 ±  1%
Compaction/dqlite-4    118.4 ±  1%
Create/sqlite-4        21.32 ±  1%
Create/dqlite-4        18.17 ±  1%
Delete/sqlite-4        25.17 ±  0%
Delete/dqlite-4        21.23 ±   ∞ ¹
Get/sqlite-4           11.99 ±  0%
Get/dqlite-4           11.99 ±  0%
Lease/sqlite-4        800.0µ ± 50%
Lease/dqlite-4        835.9µ ± 44%
List/sqlite-4          268.0 ±  4%
List/dqlite-4          34.03 ±  0%
Update/sqlite-4        25.19 ±  2%
Update/dqlite-4        20.26 ±  1%
geomean                7.284
¹ need >= 6 samples for confidence interval at level 0.95

                    │     After      │
                    │ page-writes/op │
Compaction/sqlite-4     11.24 ± 0%
Compaction/dqlite-4     8.271 ± 0%
Create/sqlite-4         5.111 ± 1%
Create/dqlite-4         4.146 ± 1%
Delete/sqlite-4         5.289 ± 1%
Delete/dqlite-4         4.313 ±  ∞ ¹
Get/sqlite-4            0.000 ± 0%
Get/dqlite-4            0.000 ± 0%
Lease/sqlite-4          0.000 ± 0%
Lease/dqlite-4          0.000 ± 0%
List/sqlite-4           0.000 ± 0%
List/dqlite-4           0.000 ± 0%
Update/sqlite-4         5.141 ± 0%
Update/dqlite-4         4.158 ± 0%
geomean                            ²
¹ need >= 6 samples for confidence interval at level 0.95
² summaries must be >0 to compute geomean

                    │     After      │
                    │ sec-reading/op │
Compaction/sqlite-4   673.8µ ± 59%
Compaction/dqlite-4   182.8µ ± 22%
Create/sqlite-4       98.50µ ± 19%
Create/dqlite-4       40.95µ ± 26%
Delete/sqlite-4       164.2µ ±  9%
Delete/dqlite-4       55.90µ ±   ∞ ¹
Get/sqlite-4          86.20µ ±  6%
Get/dqlite-4          34.50µ ± 17%
Lease/sqlite-4         0.000 ±   ?
Lease/dqlite-4         0.000 ±  0%
List/sqlite-4         6.668m ±  4%
List/dqlite-4         210.0µ ± 48%
Update/sqlite-4       164.8µ ±  6%
Update/dqlite-4       97.90µ ± 11%
geomean                            ²
¹ need >= 6 samples for confidence interval at level 0.95
² summaries must be >0 to compute geomean

                    │     After      │
                    │ sec-writing/op │
Compaction/sqlite-4   2.587m ± 11%
Compaction/dqlite-4   54.15µ ± 63%
Create/sqlite-4       909.8µ ± 14%
Create/dqlite-4       21.85µ ± 48%
Delete/sqlite-4       928.8µ ±  4%
Delete/dqlite-4       21.10µ ±   ∞ ¹
Get/sqlite-4           0.000 ±  0%
Get/dqlite-4           0.000 ±  0%
Lease/sqlite-4         0.000 ±  0%
Lease/dqlite-4         0.000 ±  0%
List/sqlite-4          0.000 ±  0%
List/dqlite-4          0.000 ±  0%
Update/sqlite-4       862.6µ ±  6%
Update/dqlite-4       25.20µ ± 35%
geomean                            ²
¹ need >= 6 samples for confidence interval at level 0.95
² summaries must be >0 to compute geomean

                    │      After      │
                    │      B/op       │
Compaction/sqlite-4    72.77Ki ± 2%
Compaction/dqlite-4    54.09Ki ± 2%
Create/sqlite-4        22.94Ki ± 0%
Create/dqlite-4        20.68Ki ± 0%
Delete/sqlite-4        25.63Ki ± 0%
Delete/dqlite-4        22.36Ki ±  ∞ ¹
Get/sqlite-4           20.61Ki ± 0%
Get/dqlite-4           18.59Ki ± 0%
Lease/sqlite-4         12.33Ki ± 0%
Lease/dqlite-4         12.33Ki ± 0%
List/sqlite-4         1004.9Ki ± 3%
List/dqlite-4          76.43Ki ± 0%
Update/sqlite-4        25.18Ki ± 0%
Update/dqlite-4        22.18Ki ± 0%
geomean                33.92Ki
¹ need >= 6 samples for confidence interval at level 0.95

                    │     After     │
                    │   allocs/op   │
Compaction/sqlite-4   3.224k ± 2%
Compaction/dqlite-4   1.490k ± 2%
Create/sqlite-4        526.0 ± 0%
Create/dqlite-4        388.5 ± 0%
Delete/sqlite-4        626.0 ± 0%
Delete/dqlite-4        412.0 ±  ∞ ¹
Get/sqlite-4           499.0 ± 0%
Get/dqlite-4           354.0 ± 0%
Lease/sqlite-4         224.0 ± 0%
Lease/dqlite-4         224.0 ± 0%
List/sqlite-4         40.83k ± 3%
List/dqlite-4         1.699k ± 0%
Update/sqlite-4        603.0 ± 0%
Update/dqlite-4        409.0 ± 0%
geomean                792.3
¹ need >= 6 samples for confidence interval at level 0.95

Copy link
Contributor

@bschimke95 bschimke95 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sorry, forgot to press the submit button.

Only a minor comment afterwards we are good to go.

cmd/tracing.go Outdated Show resolved Hide resolved
Copy link
Collaborator

@marco6 marco6 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi Louise! Thanks for this effort! Here is a first pass on this PR.

pkg/kine/server/update.go Outdated Show resolved Hide resolved
pkg/kine/server/update.go Outdated Show resolved Hide resolved
cmd/tracing.go Show resolved Hide resolved
cmd/tracing.go Outdated Show resolved Hide resolved
cmd/tracing.go Outdated Show resolved Hide resolved
pkg/kine/server/get.go Outdated Show resolved Hide resolved
if err == ErrKeyExists {
span.RecordError(err)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This shouldn't be recorded as it is not a misbehavior.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This part is removed.

return &etcdserverpb.TxnResponse{
Header: txnHeader(rev),
Succeeded: false,
}, nil
} else if err != nil {
span.RecordError(err)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use defer for this?

Copy link
Contributor Author

@louiseschmidtgen louiseschmidtgen Jul 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So span.RecordError(err) does not stop the span, it will also record just nil if there is no error. Why would you like to use defer here?

pkg/kine/server/otel.go Outdated Show resolved Hide resolved
pkg/kine/server/otel.go Outdated Show resolved Hide resolved
Copy link
Collaborator

@marco6 marco6 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is looking so much better! LGTM! Thanks!

@louiseschmidtgen louiseschmidtgen merged commit cc425ff into master Jul 22, 2024
7 checks passed
@marco6 marco6 deleted the KU-858/tracing branch July 24, 2024 06:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants