Golang应用性能监控工具 - 开源项目SigNoz介绍
Golang应用性能监控工具 - 开源项目SigNoz介绍 大家好,Gophers,
如果你想为你的应用设置一个APM和可观测性工具,那么请看看这个项目。Signoz为你的应用同时追踪指标和链路,并使用Opentelemetry进行埋点。
请查看:
GitHub
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)查看应用性能指标、分布式追踪和链路详情。

