SDKs
Go
Use Open Spanner from Go services.
Install:
go get github.com/ssubedir/open-spanner/sdk/go@latestREST Example
Create a meter and record usage from a trusted Go service:
package main
import (
"os"
httptransport "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
"github.com/ssubedir/open-spanner/sdk/go/client"
"github.com/ssubedir/open-spanner/sdk/go/client/meters"
"github.com/ssubedir/open-spanner/sdk/go/client/usages"
"github.com/ssubedir/open-spanner/sdk/go/models"
)
func main() {
transport := httptransport.New("localhost:18081", client.DefaultBasePath, []string{"http"})
transport.DefaultAuthentication = httptransport.BearerToken(os.Getenv("OPEN_SPANNER_API_KEY"))
api := client.New(transport, strfmt.Default)
meterName := "api_requests"
if _, err := api.Meters.CreateMeter(
meters.NewCreateMeterParams().WithRequest(&models.MeterCreateRequest{
Name: meterName,
Description: "API requests served",
Unit: "request",
Aggregation: "sum",
EventRetentionDays: 90,
}),
); err != nil {
panic(err)
}
if _, err := api.Usages.CreateUsage(
usages.NewCreateUsageParams().WithRequest(&models.UsageCreateRequest{
IdempotencyKey: "usage_001",
Subject: "org_123",
Meter: meterName,
Quantity: 1,
Metadata: map[string]any{
"endpoint": "/v1/orders",
"region": "us-east",
},
}),
); err != nil {
panic(err)
}
}Create an API key in the dashboard first and expose it to your backend process as OPEN_SPANNER_API_KEY.
gRPC Stream Example
Use the stream client when a backend service continuously emits usage:
package main
import (
"context"
"os"
"time"
"github.com/ssubedir/open-spanner/sdk/go/stream"
)
func main() {
ctx := context.Background()
client, err := stream.NewClient("localhost:18090", os.Getenv("OPEN_SPANNER_API_KEY"))
if err != nil {
panic(err)
}
defer client.Close()
_, err = client.Track(ctx, stream.Event{
IdempotencyKey: "stream_usage_001",
Subject: "org_123",
Meter: "api_requests",
Quantity: 1,
Timestamp: time.Now().UTC(),
Metadata: map[string]any{
"endpoint": "/v1/orders",
"region": "us-east",
},
})
if err != nil {
panic(err)
}
}Run The Full Examples
cd examples/rest/basic/go
go run main.go
cd examples/stream/basic/go
go run main.go