From e9258dc7872e9da408d5a6925ffeb58bd63740fd Mon Sep 17 00:00:00 2001 From: Ankit Khandelwal Date: Sun, 19 Apr 2026 12:52:44 -0700 Subject: [PATCH 1/2] fix(helm): redirect Bitnami images to registry.bitnami.com Bitnami stopped publishing versioned images to Docker Hub in Nov 2024. Override image.registry for kafka, postgresql, and redis sub-charts to pull from registry.bitnami.com where the versioned tags remain available. Fixes #4172 Co-Authored-By: Claude Sonnet 4.6 --- deploy/charts/openmeter/values.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/deploy/charts/openmeter/values.yaml b/deploy/charts/openmeter/values.yaml index 25789b1c5e..c0c8eabc39 100644 --- a/deploy/charts/openmeter/values.yaml +++ b/deploy/charts/openmeter/values.yaml @@ -125,6 +125,9 @@ kafka: # **Not recommended for production environments.** enabled: true + image: + registry: registry.bitnami.com + listeners: client: name: plain @@ -210,6 +213,9 @@ redis: # All further values can be configured in the `redis` section. enabled: true + image: + registry: registry.bitnami.com + auth: enabled: false @@ -221,6 +227,9 @@ postgresql: # All further values can be configured in the `postgres` section. enabled: true + image: + registry: registry.bitnami.com + nameOverride: postgres primary: From 6997020e75d5c3d2101083f299d86f86949041b8 Mon Sep 17 00:00:00 2001 From: Ankit Khandelwal Date: Sun, 19 Apr 2026 13:11:56 -0700 Subject: [PATCH 2/2] feat(client/go): extract Go client into a standalone module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #3152 Previously, importing the Go client required pulling in the entire openmeter root module with 200+ transitive dependencies, causing conflicts and forced upgrades for downstream users. Changes: - Add api/client/go/go.mod as a standalone module (github.com/openmeterio/openmeter/api/client/go) - Add api/client/go/models/ with lightweight Percentage and StatusProblem types that carry no server-side dependencies (removes go-chi and other server deps from the client footprint) - Update codegen.yaml with import-mapping to redirect pkg/models → api/client/go/models at generation time - Update client.gen.go import accordingly (reflects regenerated output) - Remove openmeter/meter internal import from client_test.go; use the generated MeterAggregationSum constant directly The standalone module's direct dependencies are: github.com/alpacahq/alpacadecimal (Percentage type) github.com/cloudevents/sdk-go/v2 (CloudEvents) github.com/getkin/kin-openapi (embedded spec) github.com/oapi-codegen/runtime (generated client runtime) Run `go mod tidy` inside api/client/go/ to generate go.sum. Co-Authored-By: Claude Sonnet 4.6 --- api/client/go/client.gen.go | 2 +- api/client/go/client_test.go | 8 +++--- api/client/go/codegen.yaml | 4 +++ api/client/go/go.mod | 12 +++++++++ api/client/go/models/percentage.go | 40 ++++++++++++++++++++++++++++++ api/client/go/models/problem.go | 28 +++++++++++++++++++++ 6 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 api/client/go/go.mod create mode 100644 api/client/go/models/percentage.go create mode 100644 api/client/go/models/problem.go diff --git a/api/client/go/client.gen.go b/api/client/go/client.gen.go index 4a6d36772b..406208f3a5 100644 --- a/api/client/go/client.gen.go +++ b/api/client/go/client.gen.go @@ -21,7 +21,7 @@ import ( "github.com/cloudevents/sdk-go/v2/event" "github.com/getkin/kin-openapi/openapi3" "github.com/oapi-codegen/runtime" - "github.com/openmeterio/openmeter/pkg/models" + "github.com/openmeterio/openmeter/api/client/go/models" ) const ( diff --git a/api/client/go/client_test.go b/api/client/go/client_test.go index ac322c82b4..2e04304177 100644 --- a/api/client/go/client_test.go +++ b/api/client/go/client_test.go @@ -11,8 +11,6 @@ import ( cloudevents "github.com/cloudevents/sdk-go/v2/event" "github.com/samber/lo" "github.com/stretchr/testify/assert" - - "github.com/openmeterio/openmeter/openmeter/meter" ) func TestIngest(t *testing.T) { @@ -120,7 +118,7 @@ func TestGetMeter(t *testing.T) { meter := Meter{ Slug: "meter-1", Description: lo.ToPtr("Test Meter"), - Aggregation: MeterAggregation(meter.MeterAggregationSum), + Aggregation: MeterAggregationSum, ValueProperty: lo.ToPtr("$.tokens"), GroupBy: lo.ToPtr(map[string]string{"model": "$.model", "type": "$.type"}), } @@ -156,14 +154,14 @@ func TestListMeters(t *testing.T) { { Slug: "meter-1", Description: lo.ToPtr("Test Meter"), - Aggregation: MeterAggregation(meter.MeterAggregationSum), + Aggregation: MeterAggregationSum, ValueProperty: lo.ToPtr("$.tokens"), GroupBy: lo.ToPtr(map[string]string{"model": "$.model", "type": "$.type"}), }, { Slug: "meter-2", Description: lo.ToPtr("Test Meter 2"), - Aggregation: MeterAggregation(meter.MeterAggregationSum), + Aggregation: MeterAggregationSum, ValueProperty: lo.ToPtr("$.tokens"), GroupBy: lo.ToPtr(map[string]string{"model": "$.model", "type": "$.type"}), }, diff --git a/api/client/go/codegen.yaml b/api/client/go/codegen.yaml index 241a0737b2..0b58bd747e 100644 --- a/api/client/go/codegen.yaml +++ b/api/client/go/codegen.yaml @@ -8,4 +8,8 @@ compatibility: # See: https://github.com/oapi-codegen/oapi-codegen/issues/778 disable-required-readonly-as-pointer: true always-prefix-enum-values: true +# Redirect internal pkg/models types to the client-local models package so +# that the generated client has no dependency on the root openmeter module. +import-mapping: + github.com/openmeterio/openmeter/pkg/models: github.com/openmeterio/openmeter/api/client/go/models output: ./client.gen.go diff --git a/api/client/go/go.mod b/api/client/go/go.mod new file mode 100644 index 0000000000..19b79b2d3f --- /dev/null +++ b/api/client/go/go.mod @@ -0,0 +1,12 @@ +module github.com/openmeterio/openmeter/api/client/go + +go 1.25.5 + +require ( + github.com/alpacahq/alpacadecimal v0.0.9 + github.com/cloudevents/sdk-go/v2 v2.16.2 + github.com/getkin/kin-openapi v0.134.0 + github.com/oapi-codegen/runtime v1.4.0 + github.com/samber/lo v1.49.1 + github.com/stretchr/testify v1.10.0 +) diff --git a/api/client/go/models/percentage.go b/api/client/go/models/percentage.go new file mode 100644 index 0000000000..9c0f709e8d --- /dev/null +++ b/api/client/go/models/percentage.go @@ -0,0 +1,40 @@ +package models + +import ( + "fmt" + + "github.com/alpacahq/alpacadecimal" +) + +type Percentage struct { + alpacadecimal.Decimal +} + +// NewPercentage creates a new Percentage from a numeric value, representation: +// 50% is represented as 50 +func NewPercentage[T float64 | int | alpacadecimal.Decimal](value T) Percentage { + p := Percentage{} + + switch v := any(value).(type) { + case int: + p = Percentage{Decimal: alpacadecimal.NewFromInt(int64(v))} + case float64: + p = Percentage{Decimal: alpacadecimal.NewFromFloat(v)} + case alpacadecimal.Decimal: + p = Percentage{Decimal: v} + } + + return p +} + +func (p Percentage) MarshalJSON() ([]byte, error) { + return []byte(p.Decimal.String()), nil +} + +func (p *Percentage) UnmarshalJSON(data []byte) error { + return p.Decimal.UnmarshalJSON(data) +} + +func (p Percentage) String() string { + return fmt.Sprintf("%s%%", p.Decimal.String()) +} diff --git a/api/client/go/models/problem.go b/api/client/go/models/problem.go new file mode 100644 index 0000000000..bc95fc3859 --- /dev/null +++ b/api/client/go/models/problem.go @@ -0,0 +1,28 @@ +package models + +import "fmt" + +// ProblemType contains a URI that identifies the problem type. +type ProblemType string + +const ProblemTypeDefault = ProblemType("about:blank") + +// StatusProblem is the RFC 7807 problem detail object. +type StatusProblem struct { + Err error `json:"-"` + + Type ProblemType `json:"type"` + Title string `json:"title"` + Status int `json:"status"` + Detail string `json:"detail,omitempty"` + Instance string `json:"instance,omitempty"` + Extensions map[string]interface{} `json:"extensions,omitempty"` +} + +func (p *StatusProblem) Error() string { + if p.Err == nil { + return fmt.Sprintf("[%s] %s", p.Title, p.Detail) + } + + return fmt.Sprintf("[%s] %s - %s", p.Title, p.Err.Error(), p.Detail) +}