blob: 0b4dbd2df7b131a03473d551bd54578e3a1e0435 [file] [log] [blame]
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))
}