Golang应用性能监控工具 - 开源项目SigNoz介绍

Golang应用性能监控工具 - 开源项目SigNoz介绍 大家好,Gophers,

如果你想为你的应用设置一个APM和可观测性工具,那么请看看这个项目。Signoz为你的应用同时追踪指标和链路,并使用Opentelemetry进行埋点。

请查看: GitHub GitHub

SigNoz/signoz

SigNoz/signoz

SigNoz帮助开发者监控他们的应用并排查问题,是DataDog、NewRelic等的开源替代品。🔥 🖥 - SigNoz/signoz


更多关于Golang应用性能监控工具 - 开源项目SigNoz介绍的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang应用性能监控工具 - 开源项目SigNoz介绍的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


SigNoz确实是一个优秀的开源APM工具,基于OpenTelemetry构建,为Golang应用提供了完整的可观测性解决方案。以下是如何在Go应用中集成SigNoz的示例:

package main

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

    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
    "go.opentelemetry.io/otel/propagation"
    "go.opentelemetry.io/otel/sdk/resource"
    sdktrace "go.opentelemetry.io/otel/sdk/trace"
    semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
    "google.golang.org/grpc"
)

func initTracer() func() {
    ctx := context.Background()
    
    // 创建OTLP gRPC导出器,指向SigNoz Collector
    exporter, err := otlptracegrpc.New(ctx,
        otlptracegrpc.WithInsecure(),
        otlptracegrpc.WithEndpoint("localhost:4317"),
        otlptracegrpc.WithDialOption(grpc.WithBlock()),
    )
    if err != nil {
        panic(err)
    }

    // 配置资源信息
    res, err := resource.New(ctx,
        resource.WithAttributes(
            semconv.ServiceNameKey.String("my-go-app"),
            semconv.ServiceVersionKey.String("1.0.0"),
            semconv.DeploymentEnvironmentKey.String("production"),
        ),
    )
    if err != nil {
        panic(err)
    }

    // 创建TracerProvider
    tp := sdktrace.NewTracerProvider(
        sdktrace.WithBatcher(exporter),
        sdktrace.WithResource(res),
        sdktrace.WithSampler(sdktrace.AlwaysSample()),
    )
    
    otel.SetTracerProvider(tp)
    otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(
        propagation.TraceContext{},
        propagation.Baggage{},
    ))

    return func() {
        if err := tp.Shutdown(ctx); err != nil {
            panic(err)
        }
    }
}

func main() {
    shutdown := initTracer()
    defer shutdown()

    tracer := otel.Tracer("main-tracer")
    
    // 示例:创建Span追踪HTTP请求
    http.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
        ctx, span := tracer.Start(r.Context(), "api-handler")
        defer span.End()
        
        // 模拟业务逻辑
        time.Sleep(100 * time.Millisecond)
        
        // 创建子Span
        _, childSpan := tracer.Start(ctx, "database-query")
        time.Sleep(50 * time.Millisecond)
        childSpan.End()
        
        w.Write([]byte("Hello from SigNoz monitored app!"))
    })

    http.ListenAndServe(":8080", nil)
}

对于指标监控,可以使用OpenTelemetry的指标SDK:

import (
    "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
    "go.opentelemetry.io/otel/metric/global"
    "go.opentelemetry.io/otel/sdk/metric"
)

func initMeter() func() {
    ctx := context.Background()
    
    exporter, err := otlpmetricgrpc.New(ctx,
        otlpmetricgrpc.WithInsecure(),
        otlpmetricgrpc.WithEndpoint("localhost:4317"),
    )
    if err != nil {
        panic(err)
    }

    provider := metric.NewMeterProvider(
        metric.WithReader(metric.NewPeriodicReader(exporter)),
    )
    global.SetMeterProvider(provider)

    return func() {
        if err := provider.Shutdown(ctx); err != nil {
            panic(err)
        }
    }
}

// 创建自定义指标
func recordMetrics() {
    meter := global.Meter("my-app-meter")
    
    requestCounter, _ := meter.Int64Counter(
        "http_requests_total",
        metric.WithDescription("Total HTTP requests"),
    )
    
    // 在请求处理中记录指标
    requestCounter.Add(context.Background(), 1)
}

使用Docker Compose快速启动SigNoz:

version: '3'
services:
  signoz:
    image: signoz/signoz:latest
    ports:
      - "3301:3301"  # 前端界面
      - "4317:4317"  # OTLP gRPC接收端口
      - "4318:4318"  # OTLP HTTP接收端口
    environment:
      - STORAGE=clickhouse
    volumes:
      - signoz-data:/var/lib/clickhouse
      
volumes:
  signoz-data:

这个配置将Go应用的追踪数据和指标发送到SigNoz Collector,可以在SigNoz的Web界面(localhost:3301)查看应用性能指标、分布式追踪和链路详情。

回到顶部