This repository has been archived by the owner on Apr 18, 2023. It is now read-only.
/
server.go
87 lines (69 loc) · 2.46 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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))
}