Skip to main content

Applicative metrics

Export application metrics to Prometheus​

GitGuardian exposes application metrics in the Prometheus format, so you can scrape them for monitoring and alerting.

info

The Prometheus exporter is not supported for embedded clusters.

Metrics available​

GitGuardian exports the following metrics, grouped by area.

Metric names in Prometheus

Metrics are listed with the names exposed in Prometheus. Some gauges also end in _total, so check the Type column before using rate(). Prometheus appends _bucket, _sum, and _count to histogram names, even when the name already ends in _bucket. For example, gim_celery_task_runtime_bucket is queried as gim_celery_task_runtime_bucket_bucket. On self-hosted instances, the plan label is always on_prem.

Where metrics are served​

Each metric is served by the pod that records it:

  • app-exporter service: gauges computed from the database and Redis (users, incidents, commits, active scans, infrastructure, queue length, installations, health checks, periodic tasks, and Public API quota, usage, and tokens).
  • Celery worker pods (port 9808): metrics recorded by background tasks, which cover most counters and histograms on this page.
  • Web application pods (/metrics on port 5050, or 5051 for public-api): metrics recorded while serving requests, such as HTTP requests, authentication, SCIM, Public API calls, and webhook events received by the hook pods.

The provided Service Monitors cover app-exporter, the Celery workers, and the ML Secret Engine when deployed. They do not cover web application pods, except hook pods when observability.exporters.webAppExporter.enabled is true. To collect metrics from the other web application pods, add your own ServiceMonitor or PodMonitor.

Each pod reports only its own values, so aggregate across pods in your queries.

Users and incidents​

MetricTypeDescriptionDimensions
gim_active_users_totalGaugeAll users in the instanceNone
gim_billable_users_totalGaugeContributing developers counted towards your licenseNone
gim_issues_totalGaugeAll incidentsseverity, status
gim_occurrences_totalGaugeAll occurrenceshidden, status

Scanning activity​

MetricTypeDescriptionDimensions
gim_commits_totalGaugeCommits processedaccount, scan_type
gim_repo_scan_active_statuses_totalGaugeScans currently pending or running, by scan featurescan_feature, status, plan
gim_scan_ended_totalCounterScans that ended, successfully or notframework_version, source_type, status, scan_type, plan, failure_reason, exception, fault_domain
gim_scan_pending_duration_secondsHistogramTime a scan spent pending before it launchedframework_version, source_type, status, scan_type, plan
gim_scan_duration_secondsHistogramScan duration, from launch to endframework_version, source_type, status, scan_type, plan
gim_scan_total_duration_secondsHistogramEnd-to-end scan duration, from creation to endframework_version, source_type, status, scan_type, plan, trigger_origin, trigger_family
gim_scan_elements_scanned_totalCounterElements scannedsource_type, scan_method, plan
gim_scan_elements_skipped_totalCounterElements skipped during scanssource_type, reason, plan
gim_scan_elements_failed_totalCounterElements that failed during scanssource_type, reason, plan
gim_scan_data_downloaded_bytes_totalCounterBytes downloaded from sources during scanssource_type, plan
gim_scan_data_scanned_bytes_totalCounterBytes scanned for secrets during scanssource_type, plan
gim_historical_scan_failure_totalCounterDeprecated, use gim_scan_ended_total. Scans that ended without successintegration_name, scan_feature, scan_status, exception, failure_reason
gim_historical_scan_duration_seconds_bucketHistogramDuration of repository scans and of historical or recurrent scans of other sourcesscan_feature, plan
gim_vcs_scan_deferred_totalCounterVCS scans deferred because the workspace reached its maximum number of simultaneous VCS scansretry_number
gim_vcs_scan_retry_scheduled_totalCounterVCS scan retries scheduled after a failuresource_type, failure_reason
gim_vcs_scan_retry_outcome_totalCounterFinal status of VCS scan retriessource_type, status
gim_vcs_clone_time_seconds_bucketHistogramTime taken to clone a repositoryintegration_name, plan, clone_method
gim_tokenscanner_content_oversized_totalCounterContent not scanned because it exceeds the maximum scan sizecaller
  • In gim_repo_scan_active_statuses_total, the scan_feature="check_run_pr" series repeats scans already counted under secrets. Exclude it when summing across features.
  • The gim_scan_pending_duration_seconds, gim_scan_elements_*, and gim_scan_data_* metrics only cover non-VCS sources (for example Slack, Jira, or Confluence).
  • gim_historical_scan_failure_total counts failed, timed out, skipped, canceled, and too large scans. Use scan_status to tell them apart.
  • The limit on simultaneous VCS scans is disabled by default, so gim_vcs_scan_deferred_total usually reports no data.

GitHub check runs​

MetricTypeDescriptionDimensions
gim_check_runs_init_totalCounterCheck runs initialized, whether or not they end up being createdcreated, setting_from, plan
gim_check_runs_created_totalCounterGitHub check runs createdplan, account_id
gim_check_runs_timed_out_totalCounterGitHub check runs that timed outplan, account_id
gim_check_runs_runtime_bucketHistogramGitHub check run duration, including queue timestatus, plan
gim_check_runs_error_codes_totalCounterGitHub check run errors by codeerror_code
gim_check_runs_pr_too_large_skipped_totalCounterCheck runs completed as neutral without a scan, because the pull request exceeded a size thresholdplan, reason
gim_check_runs_pr_too_large_scan_dispatched_totalCounterPull requests too large for the regular check run path, scanned with a scan-based check run insteadplan, reason
gim_check_runs_softtimelimit_retry_skipped_totalCounterCheck runs not retried after hitting the task time limitplaceholder
gim_github_call_errors_totalCounterGitHub errors when listing a branch's pull requests, counted on retried check runsaction, error_class

For the pr_too_large metrics, reason is the exceeded threshold: commits, files, or changes.

Real-time monitoring​

MetricTypeDescriptionDimensions
gim_realtime_event_received_totalCounterReal-time events received from integrationsintegration_name, event_type
gim_realtime_event_evaluation_started_totalCounterReal-time events whose evaluation startedintegration_name, plan, event_type
gim_realtime_event_evaluation_success_totalCounterReal-time events evaluated successfullyintegration_name, plan, event_type
gim_realtime_event_evaluation_failure_totalCounterReal-time events whose evaluation failed and will not be retriedintegration_name, exception, plan, event_type
gim_realtime_event_retry_totalCounterReal-time events retried after their evaluation hit the task time limitintegration_name, exception, plan, event_type
gim_realtime_event_dropped_totalCounterReal-time events droppedintegration_name, plan, event_type
gim_realtime_elements_scanned_totalCounterReal-time elements scanned for secretsintegration_name, plan
gim_realtime_elements_skipped_totalCounterReal-time elements skipped before scanningintegration_name, plan, reason
gim_realtime_elements_failed_totalCounterReal-time elements that failed during scanningintegration_name, plan, exception

Incidents and secrets​

MetricTypeDescriptionDimensions
gim_issue_seen_totalCounterIncidents seen in scanspolicy_name, type, kind, detector_name
gim_occurrence_seen_totalCounterOccurrences seen in scansintegration_name, policy_name, type, kind
gim_secret_validity_check_duration_secondsHistogramDuration of secret validity checksdetector_name, validity_status, has_custom_host, timed_out
gim_secret_validity_status_transition_totalCounterValidity check results, by previous and new validity status, including unchanged statusesdetector_name, previous_status, new_status
gim_presence_check_duration_secondsHistogramDuration of presence checkskind
gim_presence_check_success_totalCounterOccurrences checked for presencekind
gim_presence_check_updated_totalCounterOccurrences updated by presence checkskind, presence_value
gim_playbook_activated_totalCounterPlaybooks activatedplaybook_type, is_public
gim_playbook_deactivated_totalCounterPlaybooks deactivatedplaybook_type, is_public
gim_playbook_issues_resolved_totalCounterIncidents resolved by playbooksplaybook_type, is_public
gim_playbook_issues_ignored_totalCounterIncidents ignored by playbooksplaybook_type, is_public
gim_playbook_issues_unignored_totalCounterIncidents unignored by playbooksplaybook_type, is_public

Infrastructure​

MetricTypeDescriptionDimensions
gim_postgres_used_disk_bytesGaugeSize of the GitGuardian PostgreSQL database, excluding WAL filesNone
gim_redis_used_memory_bytesGaugeMemory used by the Redis cache instanceNone
gim_redis_available_memory_bytesGaugeTotal memory of the host running RedisNone

gim_redis_available_memory_bytes is the Redis total_system_memory value, not maxmemory or a container memory limit. On Kubernetes, it is the memory of the node running Redis.

Celery workers and queues​

MetricTypeDescriptionDimensions
gim_celery_queue_lengthGaugeTasks waiting in queuequeue_name, team
gim_celery_active_consumer_countGaugeWorker processes consuming the queue, reported by each worker podqueue_name, team
gim_celery_worker_upGaugeRunning Celery workers, each reporting 1 once startedplaceholder
gim_celery_worker_tasks_activeGaugeTasks currently being processedplaceholder
gim_celery_task_sent_totalCounterTasks sent to a queuename, queue_name, team
gim_celery_task_received_totalCounterTasks received by a workername, queue_name, team
gim_celery_task_started_totalCounterTasks started by a workername, queue_name, team
gim_celery_task_succeeded_totalCounterTasks completed successfullyname, queue_name, team
gim_celery_task_failed_totalCounterTasks that failedname, exception, queue_name, team
gim_celery_task_retried_totalCounterTasks retriedname, queue_name, team
gim_celery_task_revoked_totalCounterTasks revokedname, queue_name, team
gim_celery_task_queue_time_bucketHistogramTime spent waiting in queuename, queue_name, team
gim_celery_task_runtime_bucketHistogramExecution duration of tasks that completed successfullyname, queue_name, team

The placeholder label is always ok. Tasks sent while serving a request are counted in gim_celery_task_sent_total by the web application pods. Periodic tasks sent by the Celery beat scheduler are not counted.

HTTP requests​

MetricTypeDescriptionDimensions
gim_http_request_started_totalCounterHTTP requests initiatedapi, method, view_name
gim_http_request_success_totalCounterHTTP requests that returned a status below 400api, method, view_name, plan, ggshield_command, business_account_id
gim_http_request_failure_totalCounterHTTP requests that returned a 4xx or 5xx statusapi, method, status_code, view_name, plan, ggshield_command, business_account_id
gim_http_request_exception_totalCounterAPI requests where the view raised an unhandled exceptionapi, method, view_name, exception, plan
gim_http_request_view_duration_seconds_bucketHistogramTime spent in the view, excluding middlewareapi, method, view_name, plan
gim_http_request_middleware_before_duration_seconds_bucketHistogramTime spent in middleware before the viewapi
gim_http_request_middleware_after_duration_seconds_bucketHistogramTime spent in middleware after the viewapi
gim_http_request_body_bytes_bucketHistogramSize of the request body, taken from the Content-Length headerapi
gim_requests_with_invalid_host_header_totalCounterRequests rejected because of an invalid Host headerapi, method

Integrations and health checks​

MetricTypeDescriptionDimensions
gim_installations_totalGaugeIntegration installations in any stateintegration_type, account_id
gim_installations_statusGaugeIntegration installations by stateintegration_type, account_id, state
gim_installation_uptime_secondsHistogramTime an installation stayed healthy before becoming unhealthyintegration_type, account_id
gim_installation_downtime_secondsHistogramTime an installation stayed unhealthy before recoveringintegration_type, account_id
gim_integration_oauth2_access_tokens_expiring_soonGaugeValid OAuth2 access tokens that expire within the renewal margin (Slack, Jira Cloud, and Confluence Cloud)integration
gim_integration_api_call_success_totalCounterSuccessful API calls to integrationsintegration_name, method, status_code, api_endpoint
gim_integration_api_call_failure_totalCounterFailed API calls to integrationsintegration_name, method, status_code, exception, api_endpoint
gim_integration_api_call_retry_totalCounterRetry attempts of API calls to integrationsintegration_name, method, exception, api_endpoint
gim_integration_api_call_rate_limit_totalCounterAPI calls to integrations that hit the provider's rate limitintegration_name, method, status_code, api_endpoint
gim_integration_api_call_duration_totalCounterCumulative duration of API calls to integrations, in secondsintegration_name, method, status_code, api_endpoint
gim_integration_health_check_probe_failure_totalCounterFailed health check probes to integrations, counted separately from API call failuresintegration_name, method, status_code, exception, api_endpoint
gim_integration_app_credential_invalid_totalCounterApp-level credentials of an integration rejected by the providerintegration_name, reason
gim_integrations_oauth2_renewal_totalCounterOAuth2 token renewal attemptsintegration, outcome, failure_reason, attempt_number
gim_integration_sync_runs_totalCounterInstallation synchronization runsintegration_name, sync_type, source_type, outcome
gim_health_check_result_countGaugeServices by result of their latest health check, refreshed dailyservice_name, status
gim_outdated_health_check_countGaugeHealth checks older than the periodic rangeservice_name
gim_health_check_skipped_totalCounterHealth checks skippedreason, service_name
gim_health_check_duration_metricHistogramHealth check execution durationservice_name

Some integration metrics are reported only by specific integrations:

  • gim_integration_api_call_retry_total: Slack.
  • gim_integration_api_call_rate_limit_total: GitLab, Microsoft Teams, SharePoint Online, OneDrive, Amazon ECR, and Amazon S3. All except GitLab also count these calls in gim_integration_api_call_failure_total, so do not add the two together.
  • gim_integration_app_credential_invalid_total: Microsoft Teams, SharePoint Online, and OneDrive.

Notifications and emails​

MetricTypeDescriptionDimensions
gim_notifier_run_failure_totalCounterNotifier runs that failednotifier_name, exception, source_integration_name, event_type
gim_ebn_send_notification_event_totalCounterNotification send attempts, including retries, failures, and ignored notificationsevent_type, ebn_service_name, is_retry
gim_ebn_send_notification_event_success_totalCounterNotifications sent successfullyevent_type, ebn_service_name, is_retry
gim_ebn_send_notification_event_failure_totalCounterNotifications that failed to be sentevent_type, ebn_service_name, is_retry, retryable
gim_ebn_send_notification_event_ignored_totalCounterNotifications ignored without being sent, for example when a new incident is already ignored or resolvedevent_type, ebn_service_name, is_retry
gim_ebn_send_notification_event_duration_secondsHistogramTime taken to send a notificationevent_type, ebn_service_name, is_retry
gim_email_sent_success_totalCounterEmails sent without error, counted per recipienttemplate_name
gim_email_sent_failure_totalCounterEmails that failed to be sent, counted per recipienttemplate_name, exception

Emails sent while serving a request, such as MFA codes, are counted by the web application pods. gim_email_sent_success_total also increases when no email server (SMTP or SendGrid) is configured, even though no email is sent.

Authentication and provisioning​

MetricTypeDescriptionDimensions
gim_authentication_sso_method_totalCounterSAML responses that passed signature and authentication checks, by authentication method reported by the identity providerauth_method, idp_type
gim_saml_sso_flow_started_totalCounterSAML SSO logins startedidp_type
gim_saml_sso_sca_received_totalCounterSAML assertions received from the identity provideridp_type
gim_saml_sso_sca_rejected_totalCounterSAML assertions rejectedidp_type, error_type
gim_mfa_code_generated_totalCounterMFA codes generatedflow, is_resend
gim_mfa_rate_limit_totalCounterMFA requests rejected by rate limitingflow, kind
gim_mfa_code_verification_totalCounterMFA code verificationsflow, is_success
gim_scim_user_created_totalCounterUsers created through SCIMaccount_id
gim_scim_saml_user_created_totalCounterSAML users created through SCIMaccount_id
gim_scim_member_created_totalCounterMemberships created through SCIMaccount_id
gim_scim_member_deleted_totalCounterMemberships deleted through SCIMaccount_id
gim_scim_error_total_metric_totalCounterErrors returned by the SCIM APIstatus_code, scim_type, operation
gim_members_deactivated_totalCounterMembers deactivatedplan
gim_members_reactivated_totalCounterMembers reactivatedplan

Periodic tasks​

MetricTypeDescriptionDimensions
gim_periodic_task_period_secondsGaugeExpected periodicity of a tasktask_name, queue_name
gim_periodic_task_not_run_for_secondsGaugeTime since the scheduler last sent the tasktask_name, queue_name

Public API​

MetricTypeDescriptionDimensions
gim_public_api_quota_totalGaugeMaximum allowed API usageaccount
gim_public_api_usage_totalGaugeCurrent API usageaccount
gim_public_api_token_totalGaugeActive API tokensaccount, type
gim_public_api_scan_duration_secondsHistogramDuration of content scans through the APIis_business, preset_name, all_secrets, multiscan
gim_public_api_scan_total_documents_size_bytesHistogramTotal size of documents scanned through the APIis_business, preset_name, multiscan
gim_invalid_api_key_totalCounterAPI calls rejected because of an invalid API keymethod, path, api_type, view_name, reason, token_id
gim_quota_limit_reached_totalCounterAPI calls rejected because the quota was reachedplan, business_account_id
gim_ggshield_calls_totalCounterCalls made by ggshieldggshield_version, ggshield_os_name, ggshield_python_version, ggshield_command
System health​
MetricWhat to watch for
gim_celery_queue_lengthA backlog that keeps growing is an early sign of saturation.
gim_celery_active_consumer_countA drop means worker pods stopped. A queue with no consumer has no series at all: see the example queries below.
gim_postgres_used_disk_bytesTrack database growth. Also monitor the PostgreSQL volume disk usage.
gim_redis_used_memory_bytes / gim_redis_available_memory_bytesA high ratio indicates memory pressure on the Redis host. To detect Redis reaching its own limit, compare with maxmemory or the pod memory limit.
gim_periodic_task_not_run_for_secondsCompare against gim_periodic_task_period_seconds to detect stalled periodic tasks.
API and integrations​
MetricWhat to watch for
gim_http_request_failure_totalFilter by status_code to spot error rate spikes (especially 5xx).
gim_http_request_view_duration_seconds_bucketTrack view latency (P95/P99) to detect slowdowns. It excludes middleware time.
gim_health_check_result_countFilter by status="not_ok" to detect broken integrations. Refreshed daily, so it can lag by up to a day.
gim_integration_api_call_failure_totalFilter by integration_name and status_code to spot a provider rejecting or failing API calls.
gim_check_runs_timed_out_totalA rising rate means GitHub check runs are not completing in time.
gim_check_runs_pr_too_large_skipped_totalA rising rate means more pull requests are skipped for size.
gim_scan_ended_totalFilter by status!="finished" to spot unsuccessful scans, including canceled ones. fault_domain tells where the failure comes from: gim (GitGuardian), customer (access, deleted resources, rate limits, or size limits on your side), or provider (temporary source provider errors). Alert on fault_domain="gim".
gim_installations_statusCompare with gim_installations_total to track installations by state.
gim_ebn_send_notification_event_failure_totalFailures with retryable="False" are final. A sustained rate means notifications are not delivered.

HTTP request metrics are served by the web application pods, which the provided Service Monitors do not cover (see Where metrics are served).

Example PromQL queries​
# Celery queue saturation (waiting tasks per active consumer)
max by (queue_name) (gim_celery_queue_length) / sum by (queue_name) (gim_celery_active_consumer_count)

# Queues with waiting tasks and no active consumer (not shown by the saturation query above)
max by (queue_name) (gim_celery_queue_length) > 0 unless on (queue_name) sum by (queue_name) (gim_celery_active_consumer_count)

# HTTP 5xx error rate over the last 5 minutes
sum(rate(gim_http_request_failure_total{status_code=~"5.."}[5m]))

# View latency P95 over the last 5 minutes (excludes middleware time)
histogram_quantile(0.95, sum by (le) (rate(gim_http_request_view_duration_seconds_bucket_bucket[5m])))

# Redis memory as a share of the host's total memory (%)
gim_redis_used_memory_bytes / (gim_redis_available_memory_bytes > 0) * 100

# Periodic tasks the scheduler has not sent for 2x their expected period
gim_periodic_task_not_run_for_seconds > 2 * gim_periodic_task_period_seconds
Example alerting rules​

Below are starter Prometheus alerting rules you can adapt to your environment:

groups:
- name: gitguardian
rules:
- alert: CeleryQueueBacklog
expr: max by (queue_name) (gim_celery_queue_length) > 100
for: 5m
annotations:
summary: "Queue {{ $labels.queue_name }} has {{ $value }} pending tasks"

- alert: RedisMemoryPressure
expr: gim_redis_used_memory_bytes / (gim_redis_available_memory_bytes > 0) > 0.85
for: 10m

- alert: PeriodicTaskStalled
expr: gim_periodic_task_not_run_for_seconds > 2 * gim_periodic_task_period_seconds
for: 5m

# Requires scraping the web application pods
- alert: HighHTTPErrorRate
expr: sum(rate(gim_http_request_failure_total{status_code=~"5.."}[5m])) > 0.1
for: 5m

If Redis has maxmemory set or a container memory limit, adjust the RedisMemoryPressure threshold.

Visualizing metrics with Grafana​

GitGuardian does not ship pre-built Grafana dashboards, but all gim_* metrics are standard Prometheus metrics and work with any Grafana instance connected to your Prometheus server.

To get started:

  1. Add your Prometheus server as a Grafana data source.
  2. Create panels using the PromQL queries above.
  3. Organize panels into rows: System health (queues, Redis, Postgres, periodic tasks) and API and integrations (error rates, health checks).

Enable or disable application metrics​

Celery worker and web application pods expose their metrics without extra configuration. To activate the app-exporter gauges:

  • authorize collection of metrics by the application
  • activate Prometheus export

Authorize metrics collection​

In the Admin Area, go to Preferences, check the prometheus_metrics_active feature flag, and save.

Activate Applicative Metrics

To disable it, uncheck the flag and save.

While unchecked, the app-exporter service returns a 404 error. Celery worker and web application metrics are not affected.

Install Prometheus Operator​

Metrics are collected by Prometheus using the Prometheus Operator.

On Existing Clusters, install it yourself (installation documentation).

Activate Prometheus export using KOTS​

In the KOTS Admin Console, open the configuration page and check Activate Prometheus Exporter in the Prometheus section.

Activate Prometheus Exporter in KOTS

Save the configuration and Deploy the application. This deploys the app-exporter service and creates the Service Monitors.

To disable it, uncheck the box, save, and deploy again.

Activate Prometheus export using Helm​

To deploy the app-exporter service, set observability.exporters.statefulAppExporter.enabled=true in your values file.

observability:
exporters:
statefulAppExporter:
enabled: true

If you use Prometheus Operator, set observability.serviceMonitors.enabled=true to create the Service Monitors. Set observability.exporters.webAppExporter.enabled=true to also cover the hook pods.

observability:
exporters:
webAppExporter:
enabled: true
statefulAppExporter:
enabled: true
serviceMonitors:
enabled: true

Otherwise, you can manually scrape the metric endpoints:

  • app-exporter: http://app-exporter.<namespace>.svc.cluster.local:9808/metrics
  • Celery workers: each pod on port 9808, at /metrics. Use Kubernetes endpoints discovery to scrape every pod, since the worker service (for example worker or scanners) only reaches one pod per request.
  • Web application pods: each pod at /metrics, on port 5050 (5051 for public-api).

How to collect metrics​

On Existing Clusters, you install and configure Prometheus yourself. If you use the kube-prometheus stack with Service Monitors enabled, Prometheus discovers the covered pods automatically (see Where metrics are served).

Your Prometheus instance must select these Service Monitors. For example, kube-prometheus-stack only selects Service Monitors that carry its release label. With Helm, set it with observability.serviceMonitors.labels (see Autoscaling).

Otherwise, scrape the endpoints listed in Activate Prometheus export using Helm.

Usage data​

GitGuardian collects usage data to improve the product and support. To turn it off, uncheck custom_telemetry_active in the preferences section of the Admin area.

info

Why keep usage data enabled?

  • Product improvement: usage data shows us how the application runs across environments, so we know where to focus fixes and testing.

  • Faster support: when something breaks, usage data helps us find and fix the issue faster, which means less downtime for you.

  • Privacy: we do not collect personal or sensitive data.

Here are the categories and metrics we collect:

  • Replicated

    • Various deployment-related metrics such as cloud status, version, and uptime
  • System

    • SSO Provider
    • Network Gateway Type
    • Custom CA and proxy status
    • Prometheus Application metrics activation status
  • Users & Teams

    • Number of pending invitees, registered users with different access levels, active users.
  • Billing

    • Number of contributing developers counted towards your license, and the number excluded from the count
    • The same two counts broken down per VCS type (Azure DevOps, Bitbucket Cloud, Bitbucket Data Center, Gerrit, GitHub, GitHub Enterprise, GitLab)

    These are aggregate counts of distinct commit author email addresses. The email addresses themselves are never transmitted.

  • Historical Scan

    • Number of historical scans canceled, failed, and finished
    • Percentile durations of historical scans
    • Number of secrets found per day and source scans per day in historical scans
    • Number of historical scans considered too large
  • Integrations

    • Number of instances, installations, projects, sites for VCS and Other Data Sources
    • Number of monitored and unmonitored sources, along with source size percentiles and estimated users per VCS
  • Secret

    • Number of deactivated detectors per category, registered and unregistered feedbacks, and various metrics related to secret validity checks and incidents
  • Public API

    • Number of calls for ggshield secrets scans, including different modes and repositories
    • Number of active personal access tokens and service accounts
    • Number of public API calls