diff --git a/configfiles/datasource.yml b/configfiles/datasource.yml new file mode 100644 index 00000000..4431f203 --- /dev/null +++ b/configfiles/datasource.yml @@ -0,0 +1,9 @@ +apiVersion: 1 + +datasources: +- name: Prometheus + type: prometheus + url: http://prometheus:9090 + isDefault: true + access: proxy + editable: true \ No newline at end of file diff --git a/dev_config_docker.yaml b/configfiles/dev_config_docker.yaml similarity index 100% rename from dev_config_docker.yaml rename to configfiles/dev_config_docker.yaml diff --git a/configfiles/prometheus.yml b/configfiles/prometheus.yml new file mode 100644 index 00000000..c1970ece --- /dev/null +++ b/configfiles/prometheus.yml @@ -0,0 +1,13 @@ +scrape_configs: +- job_name: apigw + scrape_interval: 10s + static_configs: + - targets: + - vc_apigw:8080 + +- job_name: persistent + scrape_interval: 10s + static_configs: + - targets: + - vc_persistent:8080 + \ No newline at end of file diff --git a/dev_haproxy.cfg b/dev_haproxy.cfg deleted file mode 100644 index d9015e82..00000000 --- a/dev_haproxy.cfg +++ /dev/null @@ -1,69 +0,0 @@ -global - # set to /tmp due to running as user haproxy and need to write to directory to create the sock file - stats socket /tmp/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners - log stdout format raw local0 info - maxconn 2000 # Value must be set on latest haproxy versions - -defaults - mode http - timeout client 10s - timeout connect 5s - timeout server 10s - timeout http-request 10s - log global - -resolvers docker_resolver - nameserver dns 127.0.0.11:53 - -frontend stats - bind *:8404 - stats enable - stats uri / - stats refresh 10s - -#frontend front_http -# bind 0.0.0.0:80 -# bind :::80 -# -# redirect scheme https code 301 - -frontend myfrontend - # bind *:443 ssl crt /etc/ssl/vc.pem alpn h2,http/1.1 - bind *:80 - stats enable - - timeout http-request 10s - timeout http-keep-alive 4s - - #http-request redirect scheme https unless { ssl_fc } - -# http-request set-header X-SSL-Client-Cert %{+Q}[ssl_c_der,base64] -# http-request set-header X-SSL-Client-CN %{+Q}[ssl_c_s_dn(cn)] -# http-request set-header X-SSL-Client-Verify %[ssl_c_verify] - - use_backend issuer if { path /issuer } || { path_beg /issuer/ } - use_backend verifier if { path /verifier } || { path_beg /verifier/ } - use_backend datastore if { path /datastore } || { path_beg /datastore/ } - use_backend registry if { path /registry } || { path_beg /registry/ } - use_backend jaeger if { path /jaeger } || { path_beg /jaeger/ } - -backend issuer - http-request replace-path /issuer(/)?(.*) /\2 - server issuer_server issuer:8080 resolvers docker_resolver resolve-prefer ipv4 - # server issuer_server vc_issuer:8080 ssl verify optional crt-ignore-err all ca-file /cert/ladok_utv_dev.crt resolvers docker_resolver resolve-prefer ipv4 - -backend verifier - http-request replace-path /verifier(/)?(.*) /\2 - server verifier_server verifier:8080 resolvers docker_resolver resolve-prefer ipv4 - -backend datastore - http-request replace-path /datastore(/)?(.*) /\2 - server datastore_server datastore:8080 resolvers docker_resolver resolve-prefer ipv4 - -backend registry - http-request replace-path /registry(/)?(.*) /\2 - server registry_server registry:8080 resolvers docker_resolver resolve-prefer ipv4 - -backend jaeger - http-request replace-path /jaeger(/)?(.*) /\2 - server jaeger_server jaeger:16686 resolvers docker_resolver resolve-prefer ipv4 diff --git a/docker-compose.yaml b/docker-compose.yaml index 442a80bd..a48de919 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -7,7 +7,7 @@ services: image: docker.sunet.se/dc4eu/apigw:latest restart: always volumes: - - ./dev_config_docker.yaml:/config.yaml:ro + - ./configfiles/dev_config_docker.yaml:/config.yaml:ro - /var/log/sunet:/var/log/sunet depends_on: - redis @@ -24,7 +24,7 @@ services: restart: always volumes: - ./cert:/cert:ro - - ./dev_config_docker.yaml:/config.yaml:ro + - ./configfiles/dev_config_docker.yaml:/config.yaml:ro depends_on: - redis - mongo @@ -39,7 +39,7 @@ services: image: docker.sunet.se/dc4eu/registry:latest restart: always volumes: - - ./dev_config_docker.yaml:/config.yaml:ro + - ./configfiles/dev_config_docker.yaml:/config.yaml:ro depends_on: - redis - mongo @@ -54,7 +54,7 @@ services: image: docker.sunet.se/dc4eu/cache:latest restart: always volumes: - - ./dev_config_docker.yaml:/config.yaml:ro + - ./configfiles/dev_config_docker.yaml:/config.yaml:ro depends_on: - redis networks: @@ -68,7 +68,7 @@ services: image: docker.sunet.se/dc4eu/persistent:latest restart: always volumes: - - ./dev_config_docker.yaml:/config.yaml:ro + - ./configfiles/dev_config_docker.yaml:/config.yaml:ro depends_on: - redis - mongo @@ -83,7 +83,7 @@ services: image: docker.sunet.se/dc4eu/py_pdfsigner_dev:latest restart: always volumes: - - ./dev_config_docker.yaml:/config.yaml:ro + - ./configfiles/dev_config_docker.yaml:/config.yaml:ro - /var/log/sunet:/var/log/sunet depends_on: - redis @@ -98,7 +98,7 @@ services: image: docker.sunet.se/dc4eu/py_pdfvalidator_dev:latest restart: always volumes: - - ./dev_config_docker.yaml:/config.yaml:ro + - ./configfiles/dev_config_docker.yaml:/config.yaml:ro - /var/log/sunet:/var/log/sunet # - ./certs/SectigoRSADocumentSigningCA.crt:/app/SectigoRSADocumentSigningCA.crt:ro # - ./certs/USERTrustRSAAddTrustCA.crt:/app/USERTrustRSAAddTrustCA.crt:ro @@ -149,6 +149,36 @@ services: environment: - "COLLECTOR_OTLP_ENABLED=true" + prometheus: + image: prom/prometheus + container_name: prometheus + command: + - '--config.file=/etc/prometheus/prometheus.yml' + ports: + - 9090:9090 + networks: + vc-net: + ipv4_address: 172.16.50.12 + restart: unless-stopped + volumes: + - ./configfiles/prometheus.yml:/etc/prometheus/prometheus.yml:ro + - prometheus_data:/prometheus + + grafana: + image: grafana/grafana + container_name: grafana + ports: + - 3000:3000 + networks: + vc-net: + ipv4_address: 172.16.50.13 + restart: unless-stopped + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=grafana + volumes: + - ./configfiles/grafana:/etc/grafana/provisioning/datasources + networks: vc-net: driver: bridge @@ -161,3 +191,4 @@ networks: volumes: redis_data: mongo_data: + prometheus_data: diff --git a/internal/apigw/httpserver/metric.go b/internal/apigw/httpserver/metric.go index 856aa0c9..4d736f35 100644 --- a/internal/apigw/httpserver/metric.go +++ b/internal/apigw/httpserver/metric.go @@ -1,6 +1,9 @@ package httpserver -import "github.com/prometheus/client_golang/prometheus" +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) // metrics is the metrics object for httpserver type metrics struct { @@ -21,62 +24,62 @@ type metrics struct { } func (m *metrics) init() { - m.DocumentAttestationCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.DocumentAttestationCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_document_attestation_total", Help: "The total number of request to endpoint /api/v1/document/attestation", }) - m.DocumentDelCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.DocumentDelCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_document_del_total", Help: "The total number of request to endpoint /api/v1/document/del", }) - m.DocumentGetCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.DocumentGetCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_document_get_total", Help: "The total number of request to endpoint /api/v1/document", }) - m.NotificationCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.NotificationCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_notification_total", Help: "The total number of request to endpoint /api/v1/notification", }) - m.PortalCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.PortalCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_portal_total", Help: "The total number of request to endpoint /api/v1/portal", }) - m.UploadCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.UploadCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_upload_total", Help: "The total number of request to endpoint /api/v1/upload", }) - m.IDMappingCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.IDMappingCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_id_mapping_total", Help: "The total number of request to endpoint /api/v1/id/mapping", }) - m.SignCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.SignCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_sign_total", Help: "The total number of request to endpoint /api/v1/eduseal/pdf/sign", }) - m.GetSignCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.GetSignCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_get_sign_total", Help: "The total number of request to endpoint /api/v1/eduseal/pdf/:transaction_id", }) - m.ValidateCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.ValidateCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_validate_total", Help: "The total number of request to endpoint /api/v1/eduseal/pdf/validate", }) - m.RevokeCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.RevokeCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_revoke_total", Help: "The total number of request to endpoint /api/v1/eduseal/pdf/revoke", }) - m.HealthCounter = prometheus.NewCounter(prometheus.CounterOpts{ + m.HealthCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "apigw_http_endpoint_health_total", Help: "The total number of request to endpoint /health", }) diff --git a/internal/apigw/httpserver/service.go b/internal/apigw/httpserver/service.go index 305b415f..d962cbfc 100644 --- a/internal/apigw/httpserver/service.go +++ b/internal/apigw/httpserver/service.go @@ -33,7 +33,7 @@ type Service struct { gin *gin.Engine tlsConfig *tls.Config tp *trace.Tracer - metrics metrics + metrics *metrics } // New creates a new httpserver service @@ -46,7 +46,7 @@ func New(ctx context.Context, config *model.Cfg, api *apiv1.Client, tp *trace.Tr server: &http.Server{ ReadHeaderTimeout: 2 * time.Second, }, - metrics: metrics{}, + metrics: &metrics{}, } s.metrics.init() diff --git a/internal/persistent/db/vc_datastore.go b/internal/persistent/db/vc_datastore.go index 5e5e1fdd..4f896780 100644 --- a/internal/persistent/db/vc_datastore.go +++ b/internal/persistent/db/vc_datastore.go @@ -4,6 +4,8 @@ import ( "context" "vc/pkg/model" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" @@ -13,8 +15,9 @@ import ( // VCDatastoreColl is the collection of datastore type VCDatastoreColl struct { - service *Service - coll *mongo.Collection + service *Service + coll *mongo.Collection + metricSave prometheus.Counter } func (c *VCDatastoreColl) createIndex(ctx context.Context) error { @@ -42,11 +45,17 @@ func (c *VCDatastoreColl) Save(ctx context.Context, doc *model.Upload) error { ctx, span := c.service.tp.Start(ctx, "db:vc:datastore:save") defer span.End() + c.metricSave = promauto.NewCounter(prometheus.CounterOpts{ + Name: "persistent_vc_db_save_total", + }) + + res, err := c.coll.InsertOne(ctx, doc) if err != nil { span.SetStatus(codes.Error, err.Error()) return err } + c.metricSave.Inc() c.service.log.Info("saved document", "document_id", doc.Meta.DocumentID, "inserted_id", res.InsertedID) return nil } diff --git a/internal/persistent/simplequeue/queue_vc_save.go b/internal/persistent/simplequeue/queue_vc_save.go index 14333d8c..e4f0fe94 100644 --- a/internal/persistent/simplequeue/queue_vc_save.go +++ b/internal/persistent/simplequeue/queue_vc_save.go @@ -14,10 +14,9 @@ import ( // VCPersistentSave holds the ladok delete signed queue type VCPersistentSave struct { - service *Service - log *logger.Log - metricEnqueueCounter prometheus.Counter - metricWorkerCounter prometheus.Counter + service *Service + log *logger.Log + metricWorkerCounter prometheus.Counter *retask.Queue } @@ -30,11 +29,6 @@ func NewVCPersistentSave(ctx context.Context, service *Service, queueName string vcPersistentSave.Queue = vcPersistentSave.service.queueClient.NewQueue(ctx, queueName) - vcPersistentSave.metricEnqueueCounter = promauto.NewCounter(prometheus.CounterOpts{ - Name: "persistent_queue_vc_save_enqueue_total", - //Help: "The total number of added messages to the eduseal_del_signed queue", - }) - vcPersistentSave.metricWorkerCounter = promauto.NewCounter(prometheus.CounterOpts{ Name: "persistent_queue_vc_save_worker_total", }) @@ -50,8 +44,6 @@ func (s *VCPersistentSave) Enqueue(ctx context.Context, message any) (*retask.Jo ctx, span := s.service.tp.Start(ctx, "simplequeue:VCPersistentSave:Enqueue") defer span.End() - s.metricEnqueueCounter.Inc() - data, err := json.Marshal(message) if err != nil { span.SetStatus(codes.Error, err.Error())