Concelier GHSA Connector - Operations Runbook

Last updated: 2026-05-08

This runbook is for operators who run the GitHub Security Advisories (GHSA) connector in a Stella Ops Concelier instance. It covers rate-limit telemetry, configuration, optional credential acquisition, the default job schedule, and the recovery steps to take when GitHub throttles the connector.

1. Overview

The GitHub Security Advisories (GHSA) connector pulls advisory metadata from the GitHub REST API /advisories endpoint. Public global advisories can be fetched anonymously; a GitHub token is optional and mainly raises rate limits or supports enterprise routing. GitHub enforces both primary and secondary rate limits, so operators must monitor usage and configure retries to avoid throttling incidents.

2. Rate-limit telemetry

The connector surfaces rate-limit headers on every fetch and exposes the following metrics via OpenTelemetry:

MetricDescriptionTags
ghsa.ratelimit.limitSamples the reported request quota at fetch time.phase, resource
ghsa.ratelimit.remainingRemaining requests returned by X-RateLimit-Remaining.phase, resource
ghsa.ratelimit.reset_secondsSeconds until X-RateLimit-Reset.phase, resource
ghsa.ratelimit.headroom_pctPercentage of quota still available.phase, resource
ghsa.ratelimit.headroom_pct_currentLatest headroom percentage per resource.phase, resource
ghsa.ratelimit.exhaustedIncremented whenever GitHub returns zero remaining quota.phase

Dashboards and alerts:

3. Configuration paths

The persisted source configuration is the primary operator path; see Advisory source credential entry for the shared workflow across connectors.

Primary operator path:

The persisted source configuration key is apiToken. This field is optional for public global advisories. Secrets are retained server-side and are not echoed back after storage.

Compatibility fallback (concelier.yaml):

concelier:
  sources:
    ghsa:
      apiToken: "${GITHUB_PAT}"
      pageSize: 10
      maxPagesPerFetch: 1
      requestDelay: "00:00:00.200"
      failureBackoff: "00:05:00"
      rateLimitWarningThreshold: 500
      secondaryRateLimitBackoff: "00:02:00"

Recommendations:

4. Credential acquisition

Where to sign in:

What to create:

Upstream notes:

Legacy host/env distribution remains available for older deployments, but it is no longer the preferred operator path.

5. Default job schedule

Job kindCronTimeoutLease
source:ghsa:fetch1,11,21,31,41,51 * * * *6 minutes4 minutes
source:ghsa:parse3,13,23,33,43,53 * * * *5 minutes4 minutes
source:ghsa:map5,15,25,35,45,55 * * * *5 minutes4 minutes

These defaults spread GHSA stages across the hour so fetch completes before parse/map fire.

6. Runbook steps when throttled

  1. Check ghsa.ratelimit.exhausted for the affected phase.
  2. Check the latest source:ghsa:fetch job error. Primary anonymous REST quota exhaustion before any list data is fetched is expected to fail fast and rely on the next scheduled run or a manual retry after reset.
  3. If quota is exhausted during detail fetches after a list page was read, the connector preserves already-fetched document ids in the cursor so later parse/map jobs can process partial progress and the next fetch can resume the same window.
  4. If exhaustion persists:
    • Verify no unrelated jobs are sharing the token.
    • Temporarily reduce MaxPagesPerFetch or PageSize.
    • Consider provisioning a dedicated token.
  5. After quota resets, return settings to their normal values and monitor for at least one hour.

7. Canonical metric fallback analytics

When GitHub omits CVSS vectors or scores, the connector assigns a deterministic canonical metric ID in the form ghsa:severity/<level> and publishes it to Merge so severity precedence still resolves against GHSA even without CVSS data.