88 lines
2.5 KiB
Go
88 lines
2.5 KiB
Go
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))
|
|
}
|