Skip to content

Deploy to Render: a one-click metrics pipeline, and the install telemetry it reports #331

Closed

Description

@turbolytics

@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.

Design

Specs and plans are in #330:

  • docs/superpowers/specs/2026-09-18-render-metrics-template-design.md, the umbrella: scope, decisions, Blueprint, metric model, read API, auth, telemetry, build order.

Work

  • 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.

Activity

  1. turbolytics commented on Sep 18, 2026

    @turbolytics
    OwnerAuthor

    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.

  2. turbolytics commented on Sep 18, 2026

    @turbolytics
    OwnerAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions