| package main |
| |
| import ( |
| "fmt" |
| "log" |
| "net" |
| "net/http" |
| |
| "golang.org/x/net/context" |
| "google.golang.org/grpc" |
| |
| "github.com/grpc-ecosystem/go-grpc-prometheus" |
| pb "github.com/grpc-ecosystem/go-grpc-prometheus/examples/grpc-server-with-prometheus/protobuf" |
| "github.com/prometheus/client_golang/prometheus" |
| "github.com/prometheus/client_golang/prometheus/promhttp" |
| ) |
| |
| // DemoServiceServer defines a Server. |
| type DemoServiceServer struct{} |
| |
| func newDemoServer() *DemoServiceServer { |
| return &DemoServiceServer{} |
| } |
| |
| // SayHello implements a interface defined by protobuf. |
| func (s *DemoServiceServer) SayHello(ctx context.Context, request *pb.HelloRequest) (*pb.HelloResponse, error) { |
| customizedCounterMetric.WithLabelValues(request.Name).Inc() |
| return &pb.HelloResponse{Message: fmt.Sprintf("Hello %s", request.Name)}, nil |
| } |
| |
| var ( |
| // Create a metrics registry. |
| reg = prometheus.NewRegistry() |
| |
| // Create some standard server metrics. |
| grpcMetrics = grpc_prometheus.NewServerMetrics() |
| |
| // Create a customized counter metric. |
| customizedCounterMetric = prometheus.NewCounterVec(prometheus.CounterOpts{ |
| Name: "demo_server_say_hello_method_handle_count", |
| Help: "Total number of RPCs handled on the server.", |
| }, []string{"name"}) |
| ) |
| |
| func init() { |
| // Register standard server metrics and customized metrics to registry. |
| reg.MustRegister(grpcMetrics, customizedCounterMetric) |
| customizedCounterMetric.WithLabelValues("Test") |
| } |
| |
| // NOTE: Graceful shutdown is missing. Don't use this demo in your production setup. |
| func main() { |
| // Listen an actual port. |
| lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 9093)) |
| if err != nil { |
| log.Fatalf("failed to listen: %v", err) |
| } |
| defer lis.Close() |
| |
| // Create a HTTP server for prometheus. |
| httpServer := &http.Server{Handler: promhttp.HandlerFor(reg, promhttp.HandlerOpts{}), Addr: fmt.Sprintf("0.0.0.0:%d", 9092)} |
| |
| // Create a gRPC Server with gRPC interceptor. |
| grpcServer := grpc.NewServer( |
| grpc.StreamInterceptor(grpcMetrics.StreamServerInterceptor()), |
| grpc.UnaryInterceptor(grpcMetrics.UnaryServerInterceptor()), |
| ) |
| |
| // Create a new api server. |
| demoServer := newDemoServer() |
| |
| // Register your service. |
| pb.RegisterDemoServiceServer(grpcServer, demoServer) |
| |
| // Initialize all metrics. |
| grpcMetrics.InitializeMetrics(grpcServer) |
| |
| // Start your http server for prometheus. |
| go func() { |
| if err := httpServer.ListenAndServe(); err != nil { |
| log.Fatal("Unable to start a http server.") |
| } |
| }() |
| |
| // Start your gRPC server. |
| log.Fatal(grpcServer.Serve(lis)) |
| } |