Files
weatherfeeder/docs/troubleshooting.md
Eric Rakestraw 002f9d0ba6
All checks were successful
ci/woodpecker/push/build-image Pipeline was successful
Clean up documentation consistency
2026-06-10 20:28:41 +00:00

8.2 KiB

Troubleshooting

Use this guide with configuration and operations. Messages are emitted through the standard logger on stderr.

config load failed: ... read "config.yml"

Symptom: startup exits before building sources or sinks.

Likely cause: the process working directory does not contain config.yml, or the runtime user cannot read it.

Diagnostic: run pwd in the same working directory used by the process, then check ls -l config.yml.

Safe fix: place the intended config at ./config.yml, change the working directory, or mount the file at /weatherfeeder/config.yml when using the provided container image.

config load failed: ... parse YAML

Symptom: startup exits with a YAML parse error or an unknown field error.

Likely cause: invalid YAML syntax, multiple YAML documents, or a misspelled config struct field.

Diagnostic: inspect the line and field in the error. Feedkit uses strict YAML field decoding for config struct fields.

Safe fix: correct the YAML and compare the shape with configuration. Driver-specific params keys are validated by their source or sink constructors.

config validation failed

Symptom: startup exits and prints one or more validation messages.

Likely cause: missing sources or sinks, blank names, duplicate source or sink names, invalid mode, missing every for a polling source with mode: poll, or a route that references an unknown sink.

Diagnostic: read every bullet under config validation failed; the loader sorts these messages so multiple issues can be fixed in one edit.

Safe fix: update the top-level config fields as documented in configuration.

unknown source driver

Symptom: startup exits with build source failed.

Likely cause: sources[].driver does not match a registered weatherfeeder source driver.

Diagnostic: compare the configured driver with the source driver table in configuration.

Safe fix: correct the driver name. Current drivers include nws_observation, nws_alerts, nws_forecast_hourly, nws_forecast_narrative, nws_forecast_discussion, nws_weatherstories, openmeteo_observation, openmeteo_forecast, and openweather_observation.

unknown sink driver

Symptom: startup exits with build sink failed.

Likely cause: sinks[].driver is not registered.

Diagnostic: compare the configured driver with the sink driver table in configuration.

Safe fix: use stdout, nats, or postgres.

source expected kinds validation failed

Symptom: startup exits after building a source.

Likely cause: sources[].kinds declares a kind the source does not emit.

Diagnostic: compare the configured kinds list with the source driver kind in configuration.

Safe fix: remove kinds or set it to the kind emitted by that driver.

params.url is required Or params.user_agent is required

Symptom: startup exits with build source failed.

Likely cause: a source is missing required HTTP params, or the values are blank or not strings.

Diagnostic: inspect the named source in the error and check its params.

Safe fix: add non-empty url and user_agent values. See HTTP source params.

url must include units=metric

Symptom: startup exits for an openweather_observation source.

Likely cause: the OpenWeather URL omits units=metric or sets another unit system.

Diagnostic: inspect the query string in params.url.

Safe fix: add units=metric to the OpenWeather current-weather URL. Keep API keys out of committed configs.

source ... sources[].every must be > 0 for polling sources

Symptom: startup exits while building scheduler jobs.

Likely cause: a current weatherfeeder polling source has no usable every interval.

Diagnostic: inspect the named sources[] entry and check every.

Safe fix: set a positive duration such as 1m, 10m, or 1h.

build sink failed ... params.url is required

Symptom: startup exits while building a NATS sink.

Likely cause: the NATS sink is missing params.url, or the value is blank or not a string.

Diagnostic: inspect the named sink in the error and check its params.

Safe fix: set a NATS URL such as nats://localhost:4222.

build sink failed ... params.subject is required

Symptom: startup exits while building a NATS sink.

Likely cause: the NATS sink is missing params.subject, or the value is blank or not a string.

Diagnostic: inspect the named sink in the error and check its params.

Safe fix: set a non-empty subject such as weatherfeeder.

dispatch: sink ... failed consuming event ... NATS sink: connect

Symptom: the daemon starts, but NATS events are not published.

Likely cause: the NATS server URL is unreachable, the server is not accepting connections, or the configured URL is wrong for the runtime network.

Diagnostic: from the same runtime environment, check that the host and port in sinks[].params.url are reachable.

Safe fix: correct the NATS URL or restore broker connectivity. Other configured sinks continue receiving events.

postgres sink ... open db

Symptom: startup exits while building a Postgres sink.

Likely cause: the database URI, username, password, network path, or database availability is wrong.

Diagnostic: inspect sinks[].params.uri, username, and password; verify that the same runtime environment can reach the database.

Safe fix: correct the credentials or URI, restore database connectivity, then restart the daemon.

postgres sink ... ensure table Or ensure index

Symptom: startup exits during Postgres initialization.

Likely cause: the database user cannot create required tables or indexes, an existing object conflicts with weatherfeeder's expected table contract, or the database is unavailable during initialization.

Diagnostic: inspect the named table or index in the error and compare existing database objects with the Postgres table contract.

Safe fix: grant the needed database privileges, create a compatible schema, or perform an operator-managed migration before restarting.

postgres sink: insert into ...

Symptom: the daemon starts, but Postgres writes for some events fail.

Likely cause: a duplicate primary key, incompatible existing table definition, database constraint error, or connection failure during a write transaction.

Diagnostic: inspect the table name and database error in the log. Compare the table with Postgres integration.

Safe fix: repair the database schema or address the duplicate/connection issue. Other configured sinks continue receiving events.

No Events Appear On A Sink

Symptom: the daemon is running but the expected sink receives no events.

Likely cause: the route does not match the event kind, the source has not emitted changed content, or the sink is failing per event.

Diagnostic: check routes, source kinds, and logs for scheduler: poll failed, dispatcher: pipeline error, or dispatch: sink ... failed consuming event.

Safe fix: correct the route or source configuration. If the source uses conditional HTTP and the upstream has not changed, no event is emitted for a 304 Not Modified response; wait for changed upstream content or temporarily set params.conditional: false for diagnosis.

scheduler: poll failed

Symptom: one source logs poll failures while the daemon keeps running.

Likely cause: upstream HTTP error, bad URL, timeout, response body limit, or provider response shape that the source cannot parse.

Diagnostic: inspect the source name in the log and review its HTTP params.

Safe fix: correct the URL, user agent, timeout, or body limit. The next scheduled poll will retry.

dispatcher: pipeline error

Symptom: source polling succeeds, but one event is dropped before sinks.

Likely cause: a normalizer could not decode or map the raw payload, or dedupe received an invalid event ID.

Diagnostic: inspect the error text and the source/schema that produced the event. Review the event wire contract for expected canonical fields.

Safe fix: correct source configuration if it points to the wrong upstream product. If the upstream payload changed shape, update the relevant normalizer and tests.