...

Source file src/github.com/grpc-ecosystem/go-grpc-prometheus/examples/grpc-server-with-prometheus/server/server.go

Documentation: github.com/grpc-ecosystem/go-grpc-prometheus/examples/grpc-server-with-prometheus/server

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"net"
     7  	"net/http"
     8  
     9  	"golang.org/x/net/context"
    10  	"google.golang.org/grpc"
    11  
    12  	"github.com/grpc-ecosystem/go-grpc-prometheus"
    13  	pb "github.com/grpc-ecosystem/go-grpc-prometheus/examples/grpc-server-with-prometheus/protobuf"
    14  	"github.com/prometheus/client_golang/prometheus"
    15  	"github.com/prometheus/client_golang/prometheus/promhttp"
    16  )
    17  
    18  // DemoServiceServer defines a Server.
    19  type DemoServiceServer struct{}
    20  
    21  func newDemoServer() *DemoServiceServer {
    22  	return &DemoServiceServer{}
    23  }
    24  
    25  // SayHello implements a interface defined by protobuf.
    26  func (s *DemoServiceServer) SayHello(ctx context.Context, request *pb.HelloRequest) (*pb.HelloResponse, error) {
    27  	customizedCounterMetric.WithLabelValues(request.Name).Inc()
    28  	return &pb.HelloResponse{Message: fmt.Sprintf("Hello %s", request.Name)}, nil
    29  }
    30  
    31  var (
    32  	// Create a metrics registry.
    33  	reg = prometheus.NewRegistry()
    34  
    35  	// Create some standard server metrics.
    36  	grpcMetrics = grpc_prometheus.NewServerMetrics()
    37  
    38  	// Create a customized counter metric.
    39  	customizedCounterMetric = prometheus.NewCounterVec(prometheus.CounterOpts{
    40  		Name: "demo_server_say_hello_method_handle_count",
    41  		Help: "Total number of RPCs handled on the server.",
    42  	}, []string{"name"})
    43  )
    44  
    45  func init() {
    46  	// Register standard server metrics and customized metrics to registry.
    47  	reg.MustRegister(grpcMetrics, customizedCounterMetric)
    48  	customizedCounterMetric.WithLabelValues("Test")
    49  }
    50  
    51  // NOTE: Graceful shutdown is missing. Don't use this demo in your production setup.
    52  func main() {
    53  	// Listen an actual port.
    54  	lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 9093))
    55  	if err != nil {
    56  		log.Fatalf("failed to listen: %v", err)
    57  	}
    58  	defer lis.Close()
    59  
    60  	// Create a HTTP server for prometheus.
    61  	httpServer := &http.Server{Handler: promhttp.HandlerFor(reg, promhttp.HandlerOpts{}), Addr: fmt.Sprintf("0.0.0.0:%d", 9092)}
    62  
    63  	// Create a gRPC Server with gRPC interceptor.
    64  	grpcServer := grpc.NewServer(
    65  		grpc.StreamInterceptor(grpcMetrics.StreamServerInterceptor()),
    66  		grpc.UnaryInterceptor(grpcMetrics.UnaryServerInterceptor()),
    67  	)
    68  
    69  	// Create a new api server.
    70  	demoServer := newDemoServer()
    71  
    72  	// Register your service.
    73  	pb.RegisterDemoServiceServer(grpcServer, demoServer)
    74  
    75  	// Initialize all metrics.
    76  	grpcMetrics.InitializeMetrics(grpcServer)
    77  
    78  	// Start your http server for prometheus.
    79  	go func() {
    80  		if err := httpServer.ListenAndServe(); err != nil {
    81  			log.Fatal("Unable to start a http server.")
    82  		}
    83  	}()
    84  
    85  	// Start your gRPC server.
    86  	log.Fatal(grpcServer.Serve(lis))
    87  }
    88  

View as plain text