Expose Prometheus /metrics on a separate port #35

Open
opened 2026-10-10 21:49:02 +02:00 by Sansan · 0 comments
Owner

Background

A Grafana + Prometheus + Loki stack now runs on Unraid (Grafana: http://192.168.86.100:3001, Prometheus: http://192.168.86.100:9090). Prometheus already has a musicserver scrape job that expects metrics at:

Instance | Prometheus target -- | -- prod | 192.168.86.100:9101 ref | 192.168.86.100:9102 test | 192.168.86.100:9103

The MusicServer dashboard in Grafana is ready and waiting for data.

What to do

Expose Prometheus metrics on a separate port (METRICS_PORT, default 2112). Keeping it separate means /metrics is never reachable through the public music.sanplex.xyz domain (Pangolin only forwards the main port).

  1. go get github.com/prometheus/client_golang@latest
  2. New package internal/metrics:
import (
"context"
"errors"
"net/http"
"os"
"time"

"music-server/internal/logging"

"github.com/prometheus/client_golang/prometheus/promhttp"
"go.uber.org/zap"

)

// Start serves /metrics on METRICS_PORT (default 2112). Disabled when METRICS_PORT=off.
func Start() *http.Server {
port := os.Getenv("METRICS_PORT")
if port == "off" {
return nil
}
if port == "" {
port = "2112"
}
mux := http.NewServeMux()
mux.Handle("/metrics", promhttp.Handler())
srv := &http.Server{Addr: ":" + port, Handler: mux, ReadHeaderTimeout: 5 * time.Second}
go func() {
logging.GetLogger().Info("Metrics server starting", zap.String("address", srv.Addr))
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
logging.GetLogger().Error("Metrics server error", zap.Error(err))
}
}()
return srv
}

func Shutdown(ctx context.Context, srv *http.Server) {
if srv != nil {
_ = srv.Shutdown(ctx)
}
}" class="epitaxy-diff epitaxy-fence rounded-lg overflow-clip" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; border-radius: 8px; overflow: clip; --diffs-font-size: calc(.75rem * 1); --diffs-line-height: calc(1.0625rem * 1); --diffs-font-family: "anthropic-mono", ui-monospace, monospace, "SF Mono", ui-monospace, Menlo, Consolas, monospace; --diffs-header-font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "PingFang SC", "PingFang TC", "Hiragino Sans", "Apple SD Gothic Neo", sans-serif; --diffs-addition-color-override: #32d74b; --diffs-deletion-color-override: #ff2c56; --diffs-modified-color-override: #6da7ec; --diffs-gap-inline: calc(.5rem * 1); --diffs-gap-block: calc(.25rem * 1); position: relative;">

package metrics

import (
"context"
"errors"
"net/http"
"os"
"time"
"music-server/internal/logging"
"github.com/prometheus/client_golang/prometheus/promhttp"
"go.uber.org/zap"
)
// Start serves /metrics on METRICS_PORT (default 2112). Disabled when METRICS_PORT=off.
func Start() *http.Server {
port := os.Getenv("METRICS_PORT")
if port == "off" {
return nil
}
if port == "" {
port = "2112"
}
mux := http.NewServeMux()
mux.Handle("/metrics", promhttp.Handler())
srv := &http.Server{Addr: ":" + port, Handler: mux, ReadHeaderTimeout: 5 * time.Second}
go func() {
logging.GetLogger().Info("Metrics server starting", zap.String("address", srv.Addr))
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
logging.GetLogger().Error("Metrics server error", zap.Error(err))
}
}()
return srv
}
func Shutdown(ctx context.Context, srv *http.Server) {
if srv != nil {
_ = srv.Shutdown(ctx)
}
}
  1. In cmd/main.go, call metricsServer := metrics.Start() before httpServer.ListenAndServe() and metrics.Shutdown(ctx, metricsServer) in gracefulShutdown.
  2. EXPOSE 2112 in the Dockerfile (documentation only).

The default registry already includes the Go runtime and process collectors, so with no other changes you get go_goroutines, go_memstats_*, GC stats, process_cpu_seconds_total, process_resident_memory_bytes and process_start_time_seconds. These feed the Memory, Goroutines, CPU and Uptime panels on the dashboard.

Acceptance criteria

  • not donecurl localhost:2112/metrics inside the container returns go_goroutines
  • not done/metrics on the main port (8080) is not served
  • not doneThe metrics server shuts down gracefully with the main server
  • not doneMETRICS_PORT=off disables it (handy for tests)

Follow-ups: request metrics middleware, app-specific metrics, and the Unraid deploy changes (separate issues).

Background A Grafana + Prometheus + Loki stack now runs on Unraid (Grafana: http://192.168.86.100:3001/, Prometheus: http://192.168.86.100:9090/). Prometheus already has a musicserver scrape job that expects metrics at:

Instance Prometheus target
prod 192.168.86.100:9101
ref 192.168.86.100:9102
test 192.168.86.100:9103
The MusicServer dashboard in Grafana is ready and waiting for data.

What to do
Expose Prometheus metrics on a separate port (METRICS_PORT, default 2112). Keeping it separate means /metrics is never reachable through the public music.sanplex.xyz domain (Pangolin only forwards the main port).

go get github.com/prometheus/client_golang@latest
New package internal/metrics:
package metrics

import (
"context"
"errors"
"net/http"
"os"
"time"

"music-server/internal/logging"

"github.com/prometheus/client_golang/prometheus/promhttp"
"go.uber.org/zap"

)

// Start serves /metrics on METRICS_PORT (default 2112). Disabled when METRICS_PORT=off.
func Start() *http.Server {
port := os.Getenv("METRICS_PORT")
if port == "off" {
return nil
}
if port == "" {
port = "2112"
}
mux := http.NewServeMux()
mux.Handle("/metrics", promhttp.Handler())
srv := &http.Server{Addr: ":" + port, Handler: mux, ReadHeaderTimeout: 5 * time.Second}
go func() {
logging.GetLogger().Info("Metrics server starting", zap.String("address", srv.Addr))
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
logging.GetLogger().Error("Metrics server error", zap.Error(err))
}
}()
return srv
}

func Shutdown(ctx context.Context, srv http.Server) {
if srv != nil {
_ = srv.Shutdown(ctx)
}
}
In cmd/main.go, call metricsServer := metrics.Start() before httpServer.ListenAndServe() and metrics.Shutdown(ctx, metricsServer) in gracefulShutdown.
EXPOSE 2112 in the Dockerfile (documentation only).
The default registry already includes the Go runtime and process collectors, so with no other changes you get go_goroutines, go_memstats_
, GC stats, process_cpu_seconds_total, process_resident_memory_bytes and process_start_time_seconds. These feed the Memory, Goroutines, CPU and Uptime panels on the dashboard.

Acceptance criteria
not done
curl localhost:2112/metrics inside the container returns go_goroutines
not done
/metrics on the main port (8080) is not served
not done
The metrics server shuts down gracefully with the main server
not done
METRICS_PORT=off disables it (handy for tests)
Follow-ups: request metrics middleware, app-specific metrics, and the Unraid deploy changes (separate issues).

<h3 style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-size: 15px; font-weight: 580; font-variation-settings: &quot;wght&quot; 540; letter-spacing: -0.01em; margin-block: 20px 6px; padding-block: 0px; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Background</h3><p style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">A Grafana + Prometheus + Loki stack now runs on Unraid (Grafana:<span> </span><a href="http://192.168.86.100:3001/" target="_blank" rel="noreferrer" class="text-accent hover:underline underline-offset-[1px] focus-visible:outline-hidden hide-focus-ring focus-visible:shadow-focus rounded-[3px]" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline: rgba(85, 152, 231, 0) solid 2px; scrollbar-width: thin; app-region: no-drag; color: rgb(109, 167, 236); text-decoration: none; outline-offset: 2px; border-radius: 3px; text-underline-offset: 1px; cursor: pointer;">http://192.168.86.100:3001</a>, Prometheus:<span> </span><a href="http://192.168.86.100:9090/" target="_blank" rel="noreferrer" class="text-accent hover:underline underline-offset-[1px] focus-visible:outline-hidden hide-focus-ring focus-visible:shadow-focus rounded-[3px]" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline: rgba(85, 152, 231, 0) solid 2px; scrollbar-width: thin; app-region: no-drag; color: rgb(109, 167, 236); text-decoration: none; outline-offset: 2px; border-radius: 3px; text-underline-offset: 1px; cursor: pointer;">http://192.168.86.100:9090</a>). Prometheus already has a<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">musicserver</code><span> </span>scrape job that expects metrics at:</p><div class="epitaxy-table-scroll" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: auto; app-region: initial; scrollbar-color: auto; overflow-x: auto; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"> Instance | Prometheus target -- | -- prod | 192.168.86.100:9101 ref | 192.168.86.100:9102 test | 192.168.86.100:9103 </div><p style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">The<span> </span><strong style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-weight: 500; --cds-font-axis-wght: &quot;wght&quot; 560,; font-variation-settings: &quot;GRAD&quot; 0, &quot;wght&quot; 560;">MusicServer</strong><span> </span>dashboard in Grafana is ready and waiting for data.</p><h3 style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-size: 15px; font-weight: 580; font-variation-settings: &quot;wght&quot; 540; letter-spacing: -0.01em; margin-block: 20px 6px; padding-block: 0px; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">What to do</h3><p style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Expose Prometheus metrics on a<span> </span><strong style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-weight: 500; --cds-font-axis-wght: &quot;wght&quot; 560,; font-variation-settings: &quot;GRAD&quot; 0, &quot;wght&quot; 560;">separate port</strong><span> </span>(<code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">METRICS_PORT</code>, default<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">2112</code>). Keeping it separate means<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">/metrics</code><span> </span>is never reachable through the public<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">music.sanplex.xyz</code><span> </span>domain (Pangolin only forwards the main port).</p><ol style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px 0px 0px 20px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; list-style: decimal; gap: 6px; flex-direction: column; display: flex; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial;"><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">go get github.com/prometheus/client_golang@latest</code></li><li style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial;">New package<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">internal/metrics</code>:</li></ol><div class="epitaxy-codeblock relative max-w-full w-fit min-w-[min(100%,318px)]" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; position: relative; width: fit-content; max-width: 100%; min-width: min(100%, 318px); margin-block: 4px; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><div class="relative" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; position: relative;"><div data-code-text="package metrics import ( &quot;context&quot; &quot;errors&quot; &quot;net/http&quot; &quot;os&quot; &quot;time&quot; &quot;music-server/internal/logging&quot; &quot;github.com/prometheus/client_golang/prometheus/promhttp&quot; &quot;go.uber.org/zap&quot; ) // Start serves /metrics on METRICS_PORT (default 2112). Disabled when METRICS_PORT=off. func Start() *http.Server { port := os.Getenv(&quot;METRICS_PORT&quot;) if port == &quot;off&quot; { return nil } if port == &quot;&quot; { port = &quot;2112&quot; } mux := http.NewServeMux() mux.Handle(&quot;/metrics&quot;, promhttp.Handler()) srv := &amp;http.Server{Addr: &quot;:&quot; + port, Handler: mux, ReadHeaderTimeout: 5 * time.Second} go func() { logging.GetLogger().Info(&quot;Metrics server starting&quot;, zap.String(&quot;address&quot;, srv.Addr)) if err := srv.ListenAndServe(); err != nil &amp;&amp; !errors.Is(err, http.ErrServerClosed) { logging.GetLogger().Error(&quot;Metrics server error&quot;, zap.Error(err)) } }() return srv } func Shutdown(ctx context.Context, srv *http.Server) { if srv != nil { _ = srv.Shutdown(ctx) } }" class="epitaxy-diff epitaxy-fence rounded-lg overflow-clip" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; border-radius: 8px; overflow: clip; --diffs-font-size: calc(.75rem * 1); --diffs-line-height: calc(1.0625rem * 1); --diffs-font-family: &quot;anthropic-mono&quot;, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; --diffs-header-font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; --diffs-addition-color-override: #32d74b; --diffs-deletion-color-override: #ff2c56; --diffs-modified-color-override: #6da7ec; --diffs-gap-inline: calc(.5rem * 1); --diffs-gap-block: calc(.25rem * 1); position: relative;"><diffs-container style="--diffs-font-fallback: &quot;SF Mono&quot;, Monaco, Consolas, &quot;Ubuntu Mono&quot;, &quot;Liberation Mono&quot;, &quot;Courier New&quot;, monospace; --diffs-header-font-fallback: system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, &quot;Noto Sans&quot;, &quot;Liberation Sans&quot;, Arial, sans-serif; --diffs-mixer: light-dark(#000, #fff); --diffs-gap-fallback: 8px; --diffs-scrollbar-gutter-fallback: 6px; --diffs-scrollbar-gutter: 0px; --diffs-added-light: #0dbe4e; --diffs-added-dark: #5ecc71; --diffs-modified-light: #009fff; --diffs-modified-dark: #69b1ff; --diffs-deleted-light: #ff2e3f; --diffs-deleted-dark: #ff6762; --diffs-warning-light: #d5a910; --diffs-warning-dark: #ffd452; color-scheme: dark; font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-size: 12px; line-height: 17px; font-feature-settings: normal; --diffs-bg: light-dark(#ffffff, #1e1e2e); --diffs-bg-buffer: light-dark(color-mix(in lab, light-dark(#ffffff, #1e1e2e) 92%, light-dark(#000, #fff)), color-mix(in lab, light-dark(#ffffff, #1e1e2e) 92%, light-dark(#000, #fff))); --diffs-bg-context: light-dark(color-mix(in lab, light-dark(#ffffff, #1e1e2e) 98.5%, light-dark(#000, #fff)), color-mix(in lab, light-dark(#ffffff, #1e1e2e) 92.5%, light-dark(#000, #fff))); --diffs-bg-context-gutter: light-dark(color-mix(in lab, light-dark(color-mix(in lab, light-dark(#ffffff, #1e1e2e) 98.5%, light-dark(#000, #fff)), color-mix(in lab, light-dark(#ffffff, #1e1e2e) 92.5%, light-dark(#000, #fff))) 90%, light-dark(#ffffff, #1e1e2e)), color-mix(in lab, light-dark(color-mix(in lab, light-dark(#ffffff, #1e1e2e) 98.5%, light-dark(#000, #fff)), color-mix(in lab, light-dark(#ffffff, #1e1e2e) 92.5%, light-dark(#000, #fff))) 45%, light-dark(#ffffff, #1e1e2e))); --diffs-bg-separator: light-dark(color-mix(in lab, light-dark(#ffffff, #1e1e2e) 96%, light-dark(#000, #fff)), color-mix(in lab, light-dark(#ffffff, #1e1e2e) 85%, light-dark(#000, #fff))); --diffs-fg: light-dark(#1a1a1a, #cdd6f4); --diffs-fg-number: light-dark(color-mix(in lab, light-dark(#1a1a1a, #cdd6f4) 65%, light-dark(#ffffff, #1e1e2e)), color-mix(in lab, light-dark(#1a1a1a, #cdd6f4) 65%, light-dark(#ffffff, #1e1e2e))); --diffs-fg-conflict-marker: light-dark(color-mix(in lab, light-dark(#1a1a1a, #cdd6f4) 65%, light-dark(#ffffff, #1e1e2e)), color-mix(in lab, light-dark(#1a1a1a, #cdd6f4) 65%, light-dark(#ffffff, #1e1e2e))); --diffs-deletion-base: #ff2c56; --diffs-addition-base: #32d74b; --diffs-modified-base: #6da7ec; --diffs-bg-deletion: light-dark(color-mix(in lab, light-dark(#ffffff, #1e1e2e) 88%, #ff2c56), color-mix(in lab, light-dark(#ffffff, #1e1e2e) 80%, #ff2c56)); --diffs-bg-deletion-emphasis: light-dark(rgb(from #ff2c56 r g b / .15), rgb(from #ff2c56 r g b / .2)); --diffs-bg-addition: light-dark(color-mix(in lab, light-dark(#ffffff, #1e1e2e) 88%, #32d74b), color-mix(in lab, light-dark(#ffffff, #1e1e2e) 80%, #32d74b)); --diffs-bg-addition-emphasis: light-dark(rgb(from #32d74b r g b / .15), rgb(from #32d74b r g b / .2)); --diffs-selection-base: #6da7ec; --diffs-selection-number-fg: light-dark(color-mix(in lab, #6da7ec 65%, light-dark(#000, #fff)), color-mix(in lab, #6da7ec 75%, light-dark(#000, #fff))); background-color: rgb(30, 30, 46); color: rgb(205, 214, 244); display: block; --diffs-scrollbar-gutter-measured: 0px; --diffs-dark: #cdd6f4; --diffs-dark-bg: #1e1e2e; --diffs-dark-addition-color: #a6e3a1; --diffs-dark-deletion-color: #f38ba8; --diffs-dark-modified-color: #f9e2af; --diffs-light: #1a1a1a; --diffs-light-bg: #ffffff; --diffs-light-addition-color: #1e9e3c; --diffs-light-deletion-color: #ff3a30; --diffs-light-modified-color: #0073e6; box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; --lightningcss-light: ; --lightningcss-dark: initial;"><pre data-file="" data-disable-line-numbers="" data-overflow="wrap" style="box-sizing: border-box; isolation: isolate; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; outline: none; margin: 0px; padding: 8px 45.1999px 8px 17.1999px; display: block; background-color: rgb(30, 30, 46); --diffs-grid-number-column-width: minmax(min-content, max-content); --diffs-code-grid: minmax(min-content, max-content) 1fr; letter-spacing: calc(-1ch + round(up, 1ch, 0.015625px)); font-feature-settings: &quot;liga&quot;, &quot;clig&quot;, &quot;calt&quot;; --diffs-min-number-column-width-default: 2ch;"><code data-code="" style="box-sizing: border-box; isolation: isolate; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; outline: none; margin: 0px; padding: 4px 0px; display: grid; background-color: rgb(30, 30, 46); contain: content; grid-auto-flow: dense; grid-template-columns: minmax(min-content, max-content) 1fr; overflow: clip; overscroll-behavior-x: none; tab-size: 2; scrollbar-gutter: stable; align-self: flex-start; padding-block: 0px;"><div data-gutter="" style="box-sizing: border-box; grid-template-rows: subgrid; grid-template-columns: subgrid; z-index: 3; background-color: rgb(30, 30, 46); grid-area: span 41 / 1; display: grid; position: relative;"><div data-line-type="context" data-column-number="1" data-line-index="0" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="2" data-line-index="1" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="3" data-line-index="2" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="4" data-line-index="3" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="5" data-line-index="4" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="6" data-line-index="5" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="7" data-line-index="6" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="8" data-line-index="7" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="9" data-line-index="8" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="10" data-line-index="9" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="11" data-line-index="10" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="12" data-line-index="11" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="13" data-line-index="12" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="14" data-line-index="13" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="15" data-line-index="14" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="16" data-line-index="15" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="17" data-line-index="16" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="18" data-line-index="17" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="19" data-line-index="18" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="20" data-line-index="19" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="21" data-line-index="20" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="22" data-line-index="21" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="23" data-line-index="22" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="24" data-line-index="23" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="25" data-line-index="24" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="26" data-line-index="25" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="27" data-line-index="26" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="28" data-line-index="27" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="29" data-line-index="28" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="30" data-line-index="29" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="31" data-line-index="30" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="32" data-line-index="31" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="33" data-line-index="32" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="34" data-line-index="33" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="35" data-line-index="34" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="36" data-line-index="35" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="37" data-line-index="36" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="38" data-line-index="37" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="39" data-line-index="38" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="40" data-line-index="39" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div><div data-line-type="context" data-column-number="41" data-line-index="40" style="box-sizing: content-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: lab(59.817 2.11299 -14.0711); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 1ch; position: relative; text-align: right; user-select: none; padding: 0px; border-right: 0px; min-width: 0px;"></div></div><div data-content="" style="box-sizing: border-box; grid-template-rows: subgrid; grid-template-columns: subgrid; background-color: rgb(30, 30, 46); grid-area: span 41 / 2; min-width: 0px; display: grid;"><div data-line="1" data-line-type="context" data-line-index="0" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;">package</span><span style="box-sizing: border-box; color: rgb(249, 226, 175); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(249, 226, 175); --diffs-token-light: #8E6BD9; --diffs-token-light-font-style: inherit; --diffs-token-dark: #F9E2AF; --diffs-token-dark-font-style: italic;"> metrics</span></div><div data-line="2" data-line-type="context" data-line-index="1" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"> </div><div data-line="3" data-line-type="context" data-line-index="2" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;">import</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> (</span></div><div data-line="4" data-line-type="context" data-line-index="3" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> "context"</span></div><div data-line="5" data-line-type="context" data-line-index="4" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> "errors"</span></div><div data-line="6" data-line-type="context" data-line-index="5" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> "net/http"</span></div><div data-line="7" data-line-type="context" data-line-index="6" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> "os"</span></div><div data-line="8" data-line-type="context" data-line-index="7" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> "time"</span></div><div data-line="9" data-line-type="context" data-line-index="8" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"> </div><div data-line="10" data-line-type="context" data-line-index="9" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> "music-server/internal/logging"</span></div><div data-line="11" data-line-type="context" data-line-index="10" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"> </div><div data-line="12" data-line-type="context" data-line-index="11" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> "github.com/prometheus/client_golang/prometheus/promhttp"</span></div><div data-line="13" data-line-type="context" data-line-index="12" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> "go.uber.org/zap"</span></div><div data-line="14" data-line-type="context" data-line-index="13" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">)</span></div><div data-line="15" data-line-type="context" data-line-index="14" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"> </div><div data-line="16" data-line-type="context" data-line-index="15" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #999999; --diffs-token-light-font-style: italic; --diffs-token-dark: #9399B2; --diffs-token-dark-font-style: italic;">// Start serves /metrics on METRICS_PORT (default 2112). Disabled when METRICS_PORT=off.</span></div><div data-line="17" data-line-type="context" data-line-index="16" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;">func</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;"> Start</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">()</span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;"> *</span><span style="box-sizing: border-box; color: rgb(249, 226, 175); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(249, 226, 175); --diffs-token-light: #8E6BD9; --diffs-token-light-font-style: inherit; --diffs-token-dark: #F9E2AF; --diffs-token-dark-font-style: italic;">http</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(249, 226, 175); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(249, 226, 175); --diffs-token-light: #8E6BD9; --diffs-token-light-font-style: inherit; --diffs-token-dark: #F9E2AF; --diffs-token-dark-font-style: italic;">Server</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> {</span></div><div data-line="18" data-line-type="context" data-line-index="17" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> port </span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;">:=</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> os</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">Getenv</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">(</span><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;">"METRICS_PORT"</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">)</span></div><div data-line="19" data-line-type="context" data-line-index="18" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;"> if</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> port </span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;">==</span><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> "off"</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> {</span></div><div data-line="20" data-line-type="context" data-line-index="19" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;"> return</span><span style="box-sizing: border-box; color: rgb(243, 139, 168); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(243, 139, 168); --diffs-token-light: #CD2054; --diffs-token-dark: #F38BA8;"> nil</span></div><div data-line="21" data-line-type="context" data-line-index="20" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> }</span></div><div data-line="22" data-line-type="context" data-line-index="21" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;"> if</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> port </span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;">==</span><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> ""</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> {</span></div><div data-line="23" data-line-type="context" data-line-index="22" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> port </span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;">=</span><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> "2112"</span></div><div data-line="24" data-line-type="context" data-line-index="23" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> }</span></div><div data-line="25" data-line-type="context" data-line-index="24" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> mux </span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;">:=</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> http</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">NewServeMux</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">()</span></div><div data-line="26" data-line-type="context" data-line-index="25" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> mux</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">Handle</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">(</span><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;">"/metrics"</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">,</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> promhttp</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">Handler</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">())</span></div><div data-line="27" data-line-type="context" data-line-index="26" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> srv </span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;">:=</span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;"> &amp;</span><span style="box-sizing: border-box; color: rgb(249, 226, 175); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(249, 226, 175); --diffs-token-light: #8E6BD9; --diffs-token-light-font-style: inherit; --diffs-token-dark: #F9E2AF; --diffs-token-dark-font-style: italic;">http</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(249, 226, 175); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(249, 226, 175); --diffs-token-light: #8E6BD9; --diffs-token-light-font-style: inherit; --diffs-token-dark: #F9E2AF; --diffs-token-dark-font-style: italic;">Server</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">{</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;">Addr</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">:</span><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;"> ":"</span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;"> +</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> port</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">,</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> Handler</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">:</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> mux</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">,</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> ReadHeaderTimeout</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">:</span><span style="box-sizing: border-box; color: rgb(250, 179, 135); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(250, 179, 135); --diffs-token-light: #CD2054; --diffs-token-dark: #FAB387;"> 5</span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;"> *</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> time</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;">Second</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">}</span></div><div data-line="28" data-line-type="context" data-line-index="27" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;"> go</span><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;"> func</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">()</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> {</span></div><div data-line="29" data-line-type="context" data-line-index="28" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> logging</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">GetLogger</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">().</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">Info</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">(</span><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;">"Metrics server starting"</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">,</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> zap</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">String</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">(</span><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;">"address"</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">,</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> srv</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;">Addr</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">))</span></div><div data-line="30" data-line-type="context" data-line-index="29" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;"> if</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> err </span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;">:=</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> srv</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">ListenAndServe</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">();</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> err </span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;">!=</span><span style="box-sizing: border-box; color: rgb(243, 139, 168); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(243, 139, 168); --diffs-token-light: #CD2054; --diffs-token-dark: #F38BA8;"> nil</span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;"> &amp;&amp;</span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;"> !</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;">errors</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">Is</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">(</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;">err</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">,</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> http</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;">ErrServerClosed</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">)</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> {</span></div><div data-line="31" data-line-type="context" data-line-index="30" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> logging</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">GetLogger</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">().</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">Error</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">(</span><span style="box-sizing: border-box; color: rgb(166, 227, 161); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(166, 227, 161); --diffs-token-light: #1E9E3C; --diffs-token-dark: #A6E3A1;">"Metrics server error"</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">,</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> zap</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">Error</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">(</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;">err</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">))</span></div><div data-line="32" data-line-type="context" data-line-index="31" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> }</span></div><div data-line="33" data-line-type="context" data-line-index="32" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> }()</span></div><div data-line="34" data-line-type="context" data-line-index="33" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;"> return</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> srv</span></div><div data-line="35" data-line-type="context" data-line-index="34" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">}</span></div><div data-line="36" data-line-type="context" data-line-index="35" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"> </div><div data-line="37" data-line-type="context" data-line-index="36" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;">func</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;"> Shutdown</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">(</span><span style="box-sizing: border-box; color: rgb(235, 160, 172); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(235, 160, 172); --diffs-token-light: #1A1A1A; --diffs-token-light-font-style: inherit; --diffs-token-dark: #EBA0AC; --diffs-token-dark-font-style: italic;">ctx</span><span style="box-sizing: border-box; color: rgb(249, 226, 175); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(249, 226, 175); --diffs-token-light: #8E6BD9; --diffs-token-light-font-style: inherit; --diffs-token-dark: #F9E2AF; --diffs-token-dark-font-style: italic;"> context</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(249, 226, 175); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(249, 226, 175); --diffs-token-light: #8E6BD9; --diffs-token-light-font-style: inherit; --diffs-token-dark: #F9E2AF; --diffs-token-dark-font-style: italic;">Context</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">,</span><span style="box-sizing: border-box; color: rgb(235, 160, 172); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(235, 160, 172); --diffs-token-light: #1A1A1A; --diffs-token-light-font-style: inherit; --diffs-token-dark: #EBA0AC; --diffs-token-dark-font-style: italic;"> srv</span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;"> *</span><span style="box-sizing: border-box; color: rgb(249, 226, 175); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(249, 226, 175); --diffs-token-light: #8E6BD9; --diffs-token-light-font-style: inherit; --diffs-token-dark: #F9E2AF; --diffs-token-dark-font-style: italic;">http</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(249, 226, 175); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(249, 226, 175); --diffs-token-light: #8E6BD9; --diffs-token-light-font-style: inherit; --diffs-token-dark: #F9E2AF; --diffs-token-dark-font-style: italic;">Server</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">)</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> {</span></div><div data-line="38" data-line-type="context" data-line-index="37" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(203, 166, 247); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(203, 166, 247); --diffs-token-light: #C5621B; --diffs-token-dark: #CBA6F7;"> if</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> srv </span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;">!=</span><span style="box-sizing: border-box; color: rgb(243, 139, 168); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(243, 139, 168); --diffs-token-light: #CD2054; --diffs-token-dark: #F38BA8;"> nil</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> {</span></div><div data-line="39" data-line-type="context" data-line-index="38" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> _ </span><span style="box-sizing: border-box; color: rgb(148, 226, 213); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(148, 226, 213); --diffs-token-light: #737373; --diffs-token-dark: #94E2D5;">=</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;"> srv</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">.</span><span style="box-sizing: border-box; color: rgb(137, 180, 250); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(137, 180, 250); --diffs-token-light: #0073E6; --diffs-token-light-font-style: inherit; --diffs-token-dark: #89B4FA; --diffs-token-dark-font-style: italic;">Shutdown</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">(</span><span style="box-sizing: border-box; color: rgb(205, 214, 244); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(205, 214, 244); --diffs-token-light: #1A1A1A; --diffs-token-dark: #CDD6F4;">ctx</span><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">)</span></div><div data-line="40" data-line-type="context" data-line-index="39" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;"> }</span></div><div data-line="41" data-line-type="context" data-line-index="40" style="box-sizing: border-box; --diffs-computed-decoration-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-diff-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-selected-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-editor-active-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-computed-hovered-line-bg: light-dark(#ffffff, #1e1e2e); --diffs-hover-mix-target: light-dark(#000, #fff); --diffs-line-bg: light-dark(#ffffff, #1e1e2e); color: rgb(205, 214, 244); background-color: rgb(30, 30, 46); --diffs-selection-mix-target: #6da7ec; --diffs-selection-emphasis-mix-target: #6da7ec; padding-inline: 0px; position: relative; white-space: pre-wrap; word-break: break-word; min-height: 1lh;"><span style="box-sizing: border-box; color: rgb(147, 153, 178); background-color: rgba(0, 0, 0, 0); font-weight: 400; font-style: normal; text-decoration: rgb(147, 153, 178); --diffs-token-light: #737373; --diffs-token-dark: #9399B2;">}</span></div></div></code></pre></diffs-container></div><div class="pointer-events-none absolute inset-y-0 right-1.75 flex items-start overflow-y-clip pb-0.5" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px 0px 2px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: flex; pointer-events: none; position: absolute; inset-block: 0px; right: 7px; align-items: flex-start; overflow-y: clip;"><div class="pointer-events-auto sticky flex gap-0.75 top-[calc(max(var(--epitaxy-top-fade-height,0px),var(--fade-top,0px))+5px)] mt-1.25" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 5px 0px 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: flex; pointer-events: auto; position: sticky; top: 5px; gap: 3px;"></div></div></div></div><ol start="3" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px 0px 0px 20px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; list-style: decimal; gap: 6px; flex-direction: column; display: flex; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial;">In<span> </span><span role="button" tabindex="0" class="inline box-decoration-clone rounded-[4px] focus-visible:outline-hidden hide-focus-ring focus-visible:shadow-focus" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: no-drag; cursor: default; display: inline; border-radius: 4px; -webkit-box-decoration-break: clone; box-decoration-break: clone;"><code data-epitaxy-inline-code="" data-epitaxy-file-ref="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: inherit; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: inherit; font-variant-ligatures: none; background: 0px 0px; color: rgb(109, 167, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: inherit; --code-chip-ink: #6da7ec;">cmd/main.go</code></span>, call<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">metricsServer := metrics.Start()</code><span> </span>before<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">httpServer.ListenAndServe()</code><span> </span>and<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">metrics.Shutdown(ctx, metricsServer)</code><span> </span>in<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">gracefulShutdown</code>.</li><li style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial;"><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">EXPOSE 2112</code><span> </span>in the<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">Dockerfile</code><span> </span>(documentation only).</li></ol><p style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">The default registry already includes the<span> </span><strong style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-weight: 500; --cds-font-axis-wght: &quot;wght&quot; 560,; font-variation-settings: &quot;GRAD&quot; 0, &quot;wght&quot; 560;">Go runtime and process collectors</strong>, so with no other changes you get<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">go_goroutines</code>,<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">go_memstats_*</code>, GC stats,<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">process_cpu_seconds_total</code>,<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">process_resident_memory_bytes</code><span> </span>and<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">process_start_time_seconds</code>. These feed the Memory, Goroutines, CPU and Uptime panels on the dashboard.</p><h3 style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-size: 15px; font-weight: 580; font-variation-settings: &quot;wght&quot; 540; letter-spacing: -0.01em; margin-block: 20px 6px; padding-block: 0px; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Acceptance criteria</h3><ul class="contains-task-list" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; list-style: none; gap: 6px; flex-direction: column; display: flex; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><li class="flex items-start gap-1 decoration-1 [&amp;:has(&gt;[data-done])]:line-through [&amp;:has(&gt;[data-done])]:text-muted" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: flex; align-items: flex-start; gap: 4px; text-decoration-thickness: 1px;"><span class="shrink-0 size-[calc(1rem*var(--cds-rem-scale,1))] mt-[1px] flex items-center justify-center" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 1px 0px 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: flex; align-items: center; width: 16px; height: 16px; flex-shrink: 0; justify-content: center;"><span aria-hidden="true" class="block size-[calc(0.75rem*var(--cds-rem-scale,1))] rounded-full border border-alpha-3" style="box-sizing: border-box; border: 1px solid color(srgb 1 1 1 / 0.2); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: block; width: 12px; height: 12px; border-radius: 2.14748e+09px;"></span><span class="sr-only" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: -1px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; clip-path: inset(50%); white-space: nowrap; width: 1px; height: 1px; position: absolute; overflow: hidden;">not done</span></span><span class="flex-1 min-w-0" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; min-width: 0px; flex: 1 1 0%;"><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">curl localhost:2112/metrics</code><span> </span>inside the container returns<span> </span><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">go_goroutines</code></span></li><li class="flex items-start gap-1 decoration-1 [&amp;:has(&gt;[data-done])]:line-through [&amp;:has(&gt;[data-done])]:text-muted" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: flex; align-items: flex-start; gap: 4px; text-decoration-thickness: 1px;"><span class="shrink-0 size-[calc(1rem*var(--cds-rem-scale,1))] mt-[1px] flex items-center justify-center" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 1px 0px 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: flex; align-items: center; width: 16px; height: 16px; flex-shrink: 0; justify-content: center;"><span aria-hidden="true" class="block size-[calc(0.75rem*var(--cds-rem-scale,1))] rounded-full border border-alpha-3" style="box-sizing: border-box; border: 1px solid color(srgb 1 1 1 / 0.2); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: block; width: 12px; height: 12px; border-radius: 2.14748e+09px;"></span><span class="sr-only" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: -1px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; clip-path: inset(50%); white-space: nowrap; width: 1px; height: 1px; position: absolute; overflow: hidden;">not done</span></span><span class="flex-1 min-w-0" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; min-width: 0px; flex: 1 1 0%;"><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">/metrics</code><span> </span>on the main port (8080) is<span> </span><strong style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-weight: 500; --cds-font-axis-wght: &quot;wght&quot; 560,; font-variation-settings: &quot;GRAD&quot; 0, &quot;wght&quot; 560;">not</strong><span> </span>served</span></li><li class="flex items-start gap-1 decoration-1 [&amp;:has(&gt;[data-done])]:line-through [&amp;:has(&gt;[data-done])]:text-muted" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: flex; align-items: flex-start; gap: 4px; text-decoration-thickness: 1px;"><span class="shrink-0 size-[calc(1rem*var(--cds-rem-scale,1))] mt-[1px] flex items-center justify-center" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 1px 0px 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: flex; align-items: center; width: 16px; height: 16px; flex-shrink: 0; justify-content: center;"><span aria-hidden="true" class="block size-[calc(0.75rem*var(--cds-rem-scale,1))] rounded-full border border-alpha-3" style="box-sizing: border-box; border: 1px solid color(srgb 1 1 1 / 0.2); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: block; width: 12px; height: 12px; border-radius: 2.14748e+09px;"></span><span class="sr-only" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: -1px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; clip-path: inset(50%); white-space: nowrap; width: 1px; height: 1px; position: absolute; overflow: hidden;">not done</span></span><span class="flex-1 min-w-0" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; min-width: 0px; flex: 1 1 0%;">The metrics server shuts down gracefully with the main server</span></li><li class="flex items-start gap-1 decoration-1 [&amp;:has(&gt;[data-done])]:line-through [&amp;:has(&gt;[data-done])]:text-muted" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: flex; align-items: flex-start; gap: 4px; text-decoration-thickness: 1px;"><span class="shrink-0 size-[calc(1rem*var(--cds-rem-scale,1))] mt-[1px] flex items-center justify-center" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 1px 0px 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: flex; align-items: center; width: 16px; height: 16px; flex-shrink: 0; justify-content: center;"><span aria-hidden="true" class="block size-[calc(0.75rem*var(--cds-rem-scale,1))] rounded-full border border-alpha-3" style="box-sizing: border-box; border: 1px solid color(srgb 1 1 1 / 0.2); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; display: block; width: 12px; height: 12px; border-radius: 2.14748e+09px;"></span><span class="sr-only" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: -1px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; clip-path: inset(50%); white-space: nowrap; width: 1px; height: 1px; position: absolute; overflow: hidden;">not done</span></span><span class="flex-1 min-w-0" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; min-width: 0px; flex: 1 1 0%;"><code data-epitaxy-inline-code="" style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; font-family: anthropic-mono, ui-monospace, monospace, &quot;SF Mono&quot;, ui-monospace, Menlo, Consolas, monospace; font-feature-settings: &quot;calt&quot; 0, &quot;liga&quot; 0; font-variation-settings: normal; font-size: 12px; font-variant-ligatures: none; background: none 0% 0% / auto repeat scroll padding-box border-box color(srgb 1 1 1 / 0.05); color: rgb(240, 239, 236); border-radius: 4px; padding-block: 1px; padding-inline: 2px; line-height: 1.4;">METRICS_PORT=off</code><span> </span>disables it (handy for tests)</span></li></ul><p style="box-sizing: border-box; border: 0px solid color(srgb 1 1 1 / 0.1); margin: 0px 0px 16px; padding: 0px; outline-color: rgb(85, 152, 231); scrollbar-width: thin; app-region: initial; color: rgb(240, 239, 236); font-family: ui-sans-serif, system-ui, -apple-system, &quot;Segoe UI&quot;, Roboto, &quot;PingFang SC&quot;, &quot;PingFang TC&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(30, 30, 46); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Follow-ups: request metrics middleware, app-specific metrics, and the Unraid deploy changes (separate issues).</p>Background A Grafana + Prometheus + Loki stack now runs on Unraid (Grafana: http://192.168.86.100:3001/, Prometheus: http://192.168.86.100:9090/). Prometheus already has a musicserver scrape job that expects metrics at: Instance Prometheus target prod 192.168.86.100:9101 ref 192.168.86.100:9102 test 192.168.86.100:9103 The MusicServer dashboard in Grafana is ready and waiting for data. What to do Expose Prometheus metrics on a separate port (METRICS_PORT, default 2112). Keeping it separate means /metrics is never reachable through the public music.sanplex.xyz domain (Pangolin only forwards the main port). go get github.com/prometheus/client_golang@latest New package internal/metrics: package metrics import ( "context" "errors" "net/http" "os" "time" "music-server/internal/logging" "github.com/prometheus/client_golang/prometheus/promhttp" "go.uber.org/zap" ) // Start serves /metrics on METRICS_PORT (default 2112). Disabled when METRICS_PORT=off. func Start() *http.Server { port := os.Getenv("METRICS_PORT") if port == "off" { return nil } if port == "" { port = "2112" } mux := http.NewServeMux() mux.Handle("/metrics", promhttp.Handler()) srv := &http.Server{Addr: ":" + port, Handler: mux, ReadHeaderTimeout: 5 * time.Second} go func() { logging.GetLogger().Info("Metrics server starting", zap.String("address", srv.Addr)) if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { logging.GetLogger().Error("Metrics server error", zap.Error(err)) } }() return srv } func Shutdown(ctx context.Context, srv *http.Server) { if srv != nil { _ = srv.Shutdown(ctx) } } In cmd/main.go, call metricsServer := metrics.Start() before httpServer.ListenAndServe() and metrics.Shutdown(ctx, metricsServer) in gracefulShutdown. EXPOSE 2112 in the Dockerfile (documentation only). The default registry already includes the Go runtime and process collectors, so with no other changes you get go_goroutines, go_memstats_*, GC stats, process_cpu_seconds_total, process_resident_memory_bytes and process_start_time_seconds. These feed the Memory, Goroutines, CPU and Uptime panels on the dashboard. Acceptance criteria not done curl localhost:2112/metrics inside the container returns go_goroutines not done /metrics on the main port (8080) is not served not done The metrics server shuts down gracefully with the main server not done METRICS_PORT=off disables it (handy for tests) Follow-ups: request metrics middleware, app-specific metrics, and the Unraid deploy changes (separate issues).
Sansan added the ops label 2026-10-15 21:56:21 +02:00
Sign in to join this conversation.