You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Deploy to Render: a one-click metrics pipeline, and the install telemetry it reports #331
@Ho1yShif, for your eyes: this is the plan for a one-click Deploy to Render button in this repository.
What
A Deploy to Render button in the README. One click creates:
a Postgres,
a pipeline that accepts metrics over a signed webhook and aggregates them by minute,
an HTTP API that reads them back.
Render prompts for the HMAC secret during the deploy. Five minutes after the click, a user has sent a curl and queried its result.
The metric is generic: a name, a type (count or gauge), a value, free-form dimensions, and an optional timestamp. A minute stores sum, count, min, max and last, and a six-grain rollup ladder keeps 5m through 1d.
The same template reports two install events, install.deployed and install.first_request, to a collector we run. Telemetry is on by default, prompted for at deploy beside the secret, and the README prints both payloads. The collector is this same button deployed in our own workspace with signature validation switched off on purpose, so the template monitors itself.
Where it lives
render.yaml at the repository root, because Render's button reads it from there, and every other asset under /render.
Engine: source.webhook.addr. The webhook source listens on a constant, and Render assigns the port.
Engine: sqlflow rollup gains numeric: double and a last measure. Every sum is cast to bigint today, which turns a gauge of 0.73 into 0.
Engine: StructuredBatch corrupts a JSON object stored in a text column when a string inside it has an escape. Found while probing the template's dimensions.
Release a tag with all three.
The template: render.yaml and /render, with CI that brings it up, posts a signed metric, and reads it back at every grain.
Deploy the collector from the template's PR branch. It is also the template's first real deploy.
The telemetry client, its opt-out, and the README's "What this sends".
Open checks
Whether the button honors a Blueprint in a subdirectory. Render documents only ?repo=.
Whether Render needs a health route on the webhook service's public port. The pipeline answers /healthz on :8000, not on the webhook's port.
The three engine changes are up: #332 (StructuredBatch escapes), #333 (source.webhook.addr), #334 (rollup numeric: double and last). Each passes make test-go. #333 and #334 both add a line at the top of ### Added in the changelog, so the second to merge needs a one-line rebase. Next is a release tag containing all three, which the template pins.
The template is up as a draft in #335, pinned to v2026.09.18, with CI green: the configs, the generated migration and render.yaml validate, and the end-to-end test posts signed metrics and reads them back at all six grains, 59 assertions.
It stays a draft until two things happen. The first deploy, from https://render.com/deploy?repo=https://github.com/turbolytics/sql-flow/tree/feat/render-metrics-template, which becomes the telemetry collector once SQLFLOW_WEBHOOK_AUTH=none, SQLFLOW_METRIC_NAME_PREFIX=install. and a small SQLFLOW_WEBHOOK_MAX_BODY_BYTES are set on the ingest service and the telemetry subdomain points at it. Then the telemetry client, on the same branch, with that subdomain as its default and source: render on every event.
Activity
spec: the wire format the engine can read, and a third engine defect
turbolytics commentedon Sep 18, 2026
The three engine changes are up: #332 (StructuredBatch escapes), #333 (
source.webhook.addr), #334 (rollupnumeric: doubleandlast). Each passesmake test-go. #333 and #334 both add a line at the top of### Addedin the changelog, so the second to merge needs a one-line rebase. Next is a release tag containing all three, which the template pins.handlers: an object in a text column keeps the escapes inside it (#332)
webhook: a listen address the config sets (#333)
rollup: sums that keep their fraction, and a last measure (#334)
docs: the Deploy to Render button, and the template's contract
turbolytics commentedon Sep 18, 2026
The template is up as a draft in #335, pinned to
v2026.09.18, with CI green: the configs, the generated migration andrender.yamlvalidate, and the end-to-end test posts signed metrics and reads them back at all six grains, 59 assertions.It stays a draft until two things happen. The first deploy, from
https://render.com/deploy?repo=https://github.com/turbolytics/sql-flow/tree/feat/render-metrics-template, which becomes the telemetry collector onceSQLFLOW_WEBHOOK_AUTH=none,SQLFLOW_METRIC_NAME_PREFIX=install.and a smallSQLFLOW_WEBHOOK_MAX_BODY_BYTESare set on the ingest service and the telemetry subdomain points at it. Then the telemetry client, on the same branch, with that subdomain as its default andsource: renderon every event.render: the deployer chooses the client id, and no grain holds an ans…
render: two pipeline processes writing one minute are summed, and an …
render: a sync cannot close an open pipeline, and an empty auth mode …
render: two install events, once each, disclosed in full and off with…
webhook: GET and HEAD /healthz on the source's own address (#336)
render: pin v2026.09.18.1, and give Render a health check for the pip…
render: the test's probes no longer leave a telemetry lease behind
render: a Deploy to Render button for a metrics pipeline (#335)