Search Visibility Exporter (webmaster_* metrics)

The visibility-exporter container on docker2 polls each configured search-engine webmaster API for every tracked site and exposes the results as Prometheus gauges. It is stdlib-only Python living in jakemon/visibility/.

Sites and providers

visibility/sites.json maps each site to its provider identifiers — Google Search Console (sc-domain: properties), Bing, and Yandex. Tracked sites include wiki.wikantik.com, wikantik.com, jakefear.com, wiki.jakefear.com, maiiavorobiova.com, and the thelocalwiki.com family. Provider adapters live in visibility/providers/{google,bing,yandex}.py; IndexNow keys live in visibility/indexnow-keys/.

The data window: read this before interpreting numbers

Metrics are rolling-window snapshots, not counters: each poll covers a trailing 28-day lookback ending 2 days ago (search engines lag ~2–3 days). So a Grafana range of "90d" shows how the 28-day-window gauge evolved — it does not sum to 90 days of traffic. Site totals aggregate clicks/impressions with an impression-weighted average position.

Metric families

MetricLabelsMeaning
webmaster_clicks / webmaster_impressionssite, engineSite totals for the window
webmaster_avg_positionsite, engineImpression-weighted average position
webmaster_query_impressions / _clicks / _positionsite, engine, queryTop queries
webmaster_page_impressions / _clicks / _positionsite, engine, pageTop pages
webmaster_query_pageengine, query, pageGoogle query→page pairs (value = impressions)
webmaster_indexed_pagessite, engineBest-effort index counts
webmaster_exporter_up / _last_success_timestamp_secondsengineProvider health

Querying it directly (the agent path)

Grafana needs auth; Prometheus on docker2:9090 does not. The fastest analysis loop is PromQL over the API, e.g. top pages for a site:

curl -s 'http://docker2:9090/api/v1/query' \
  --data-urlencode 'query=topk(25, webmaster_page_impressions{site="wiki.wikantik.com", engine="google"})'

The search-visibility Grafana dashboard (uid search-visibility, in dashboards/services/) renders these plus AI-referral log panels from Loki. The 2026-08-08 SEO pass on the wiki was driven entirely from these metrics — the workflow is documented from the consumption side in the wikantik SEO notes.

Supporting modules

history.py (snapshot history), opportunities.py (under-performing query/page detection), report.py (report rendering), actions.py (IndexNow submissions and similar) — all unit-tested beside the code (test_*.py).

See Also