Admin SDK — Querying Analytics
This feature is in beta. Core behavior is stable and ready to try, but some APIs or configuration may still evolve before general availability.
The Admin SDK provides two analytics capabilities: querying request log metrics (automatic API usage data) and managing custom events (track + query). All endpoints require a Service Key.
Analytics querying and event tracking are available in all Admin SDKs.
Setup
- TypeScript
- Dart
- Kotlin
- Java
- Scala
- Python
- Go
- PHP
- Rust
- C#
- Ruby
- Elixir
import { createAdminClient } from '@edge-base/admin';
const admin = createAdminClient('https://my-edgebase-server.com', {
serviceKey: process.env.EDGEBASE_SERVICE_KEY,
});
import 'dart:io';
import 'package:edgebase_admin/edgebase_admin.dart';
final admin = AdminEdgeBase(
'https://my-edgebase-server.com',
serviceKey: Platform.environment['EDGEBASE_SERVICE_KEY']!,
);
import dev.edgebase.sdk.admin.AdminEdgeBase
val admin = AdminEdgeBase(
"https://my-edgebase-server.com",
serviceKey = System.getenv("EDGEBASE_SERVICE_KEY") ?: ""
)
import dev.edgebase.sdk.admin.*;
AdminEdgeBase admin = EdgeBase.admin(
"https://my-edgebase-server.com",
System.getenv("EDGEBASE_SERVICE_KEY")
);
import dev.edgebase.sdk.scala.admin.AdminEdgeBase
val admin = AdminEdgeBase(
"https://my-edgebase-server.com",
sys.env("EDGEBASE_SERVICE_KEY")
)
import os
from edgebase_admin import create_admin_client
admin = create_admin_client(
"https://my-edgebase-server.com",
service_key=os.environ["EDGEBASE_SERVICE_KEY"],
)
import (
"os"
edgebase "github.com/edge-base/sdk-go"
)
admin := edgebase.NewAdminClient("https://my-edgebase-server.com", os.Getenv("EDGEBASE_SERVICE_KEY"))
use EdgeBase\Admin\AdminClient;
$admin = new AdminClient('https://my-edgebase-server.com', getenv('EDGEBASE_SERVICE_KEY'));
use edgebase_admin::EdgeBase;
let admin = EdgeBase::server(
"https://my-edgebase-server.com",
&std::env::var("EDGEBASE_SERVICE_KEY").unwrap(),
)?;
using System;
using EdgeBase.Admin;
var admin = new AdminClient(
"https://my-edgebase-server.com",
Environment.GetEnvironmentVariable("EDGEBASE_SERVICE_KEY")!
);
require "edgebase_admin"
admin = EdgebaseAdmin::AdminClient.new(
"https://my-edgebase-server.com",
service_key: ENV.fetch("EDGEBASE_SERVICE_KEY")
)
alias EdgeBaseAdmin
admin =
EdgeBaseAdmin.new("https://my-edgebase-server.com",
service_key: System.fetch_env!("EDGEBASE_SERVICE_KEY")
)
The same analytics surface is exposed across all Admin SDKs for overview, timeSeries, breakdown, topEndpoints, track, trackBatch, and queryEvents.
Part 1: Request Log Metrics
These methods query automatic API usage data — the same metrics shown in the Admin Dashboard.
Overview
Get a complete snapshot: time series, summary, breakdown by category, and top endpoints.
- TypeScript
- Dart
- Kotlin
- Java
- Scala
- Python
- Go
- PHP
- Rust
- C#
- Ruby
- Elixir
const data = await admin.analytics.overview({ range: '7d' });
console.log(data.summary.totalRequests);
console.log(data.breakdown[0]);
final data = await admin.analytics.overview({'range': '7d'});
print(data['summary']);
print(data['breakdown']);
val data = admin.analytics.overview(mapOf("range" to "7d"))
println(data["summary"])
println(data["breakdown"])
var data = admin.analytics().overview(Map.of("range", "7d"));
System.out.println(data.get("summary"));
System.out.println(data.get("breakdown"));
val data = admin.analytics.overview(Map("range" -> "7d"))
println(data("summary"))
println(data("breakdown"))
data = admin.analytics().overview(range="7d")
print(data["summary"])
print(data["breakdown"])
import "context"
ctx := context.Background()
data, _ := admin.Analytics().Overview(ctx, map[string]string{"range": "7d"})
fmt.Println(data["summary"])
fmt.Println(data["breakdown"])
$data = $admin->analytics()->overview(['range' => '7d']);
var_dump($data['summary']);
var_dump($data['breakdown']);
use std::collections::HashMap;
let data = admin.analytics().overview(Some(HashMap::from([
("range".to_string(), "7d".to_string())
]))).await?;
println!("{:?}", data.get("summary"));
println!("{:?}", data.get("breakdown"));
var data = await admin.Analytics.OverviewAsync(new Dictionary<string, string> {
["range"] = "7d",
});
Console.WriteLine(data["summary"]);
Console.WriteLine(data["breakdown"]);
data = admin.analytics.overview("range" => "7d")
pp data["summary"]
pp data["breakdown"]
data =
admin
|> EdgeBaseAdmin.analytics()
|> EdgeBaseAdmin.Analytics.overview!(range: "7d")
IO.inspect(data["summary"])
IO.inspect(data["breakdown"])
Time Series, Breakdown, and Top Endpoints
All request-log helpers accept the same option shape:
| Parameter | Type | Default | Description |
|---|---|---|---|
range | string | '24h' | Time range: '1h', '6h', '24h', '7d', '30d', '90d' |
category | string | — | Filter by route category. Common values include 'auth', 'db', 'storage', 'databaseLive', 'room', 'push', 'function', 'kv', 'sql', 'd1', 'vectorize', 'admin', 'config', and 'health' |
groupBy | string | 'hour' | Time grouping: 'minute', 'hour', 'day' |
const points = await admin.analytics.timeSeries({ range: '24h', groupBy: 'hour' });
const items = await admin.analytics.breakdown({ range: '30d' });
const top = await admin.analytics.topEndpoints({ range: '7d' });
Part 2: Custom Events
Track and query custom events from your server-side code. Events are stored in LogsDO with 90-day retention (daily rollups for older data).
Tracking Events
- TypeScript
- Dart
- Kotlin
- Java
- Scala
- Python
- Go
- PHP
- Rust
- C#
- Ruby
- Elixir
await admin.analytics.track('user_upgraded', { plan: 'pro', amount: 29.99 }, 'user_123');
await admin.analytics.trackBatch([
{ name: 'email_sent', properties: { template: 'welcome' }, userId: 'user_123' },
{ name: 'cron_completed', properties: { job: 'cleanup', duration: 1200 } },
]);
await admin.analytics.track('user_upgraded', {'plan': 'pro', 'amount': 29.99}, 'user_123');
await admin.analytics.trackBatch([
AnalyticsEvent(name: 'email_sent', properties: {'template': 'welcome'}, userId: 'user_123'),
AnalyticsEvent(name: 'cron_completed', properties: {'job': 'cleanup', 'duration': 1200}),
]);
admin.analytics.track("user_upgraded", mapOf("plan" to "pro", "amount" to 29.99), "user_123")
admin.analytics.trackBatch(listOf(
AnalyticsEvent(name = "email_sent", properties = mapOf("template" to "welcome"), userId = "user_123"),
AnalyticsEvent(name = "cron_completed", properties = mapOf("job" to "cleanup", "duration" to 1200)),
))
admin.analytics().track("user_upgraded", Map.of("plan", "pro", "amount", 29.99), "user_123");
admin.analytics().trackBatch(List.of(
new AnalyticsClient.AnalyticsEvent("email_sent", Map.of("template", "welcome"), null, "user_123"),
new AnalyticsClient.AnalyticsEvent("cron_completed", Map.of("job", "cleanup", "duration", 1200), null, null)
));
import dev.edgebase.sdk.scala.admin.AnalyticsEvent
admin.analytics.track(
"user_upgraded",
Map("plan" -> "pro", "amount" -> 29.99),
userId = Some("user_123")
)
admin.analytics.trackBatch(Seq(
AnalyticsEvent("email_sent", Map("template" -> "welcome"), userId = Some("user_123")),
AnalyticsEvent("cron_completed", Map("job" -> "cleanup", "duration" -> 1200))
))
admin.analytics().track("user_upgraded", {"plan": "pro", "amount": 29.99}, user_id="user_123")
admin.analytics().track_batch([
{"name": "email_sent", "properties": {"template": "welcome"}, "userId": "user_123"},
{"name": "cron_completed", "properties": {"job": "cleanup", "duration": 1200}},
])
import "context"
ctx := context.Background()
_ = admin.Analytics().Track(ctx, "user_upgraded", map[string]interface{}{
"plan": "pro",
"amount": 29.99,
}, "user_123")
_ = admin.Analytics().TrackBatch(ctx, []edgebase.AnalyticsEvent{
{Name: "email_sent", Properties: map[string]interface{}{"template": "welcome"}, UserID: "user_123"},
{Name: "cron_completed", Properties: map[string]interface{}{"job": "cleanup", "duration": 1200}},
})
$admin->analytics()->track('user_upgraded', ['plan' => 'pro', 'amount' => 29.99], 'user_123');
$admin->analytics()->trackBatch([
['name' => 'email_sent', 'properties' => ['template' => 'welcome'], 'userId' => 'user_123'],
['name' => 'cron_completed', 'properties' => ['job' => 'cleanup', 'duration' => 1200]],
]);
use serde_json::json;
admin.analytics().track(
"user_upgraded",
Some(json!({"plan": "pro", "amount": 29.99})),
Some("user_123"),
).await?;
admin.analytics().track_batch(vec![
json!({"name": "email_sent", "properties": {"template": "welcome"}, "userId": "user_123"}),
json!({"name": "cron_completed", "properties": {"job": "cleanup", "duration": 1200}}),
]).await?;
await admin.Analytics.TrackAsync(
"user_upgraded",
new Dictionary<string, object?> { ["plan"] = "pro", ["amount"] = 29.99 },
"user_123"
);
await admin.Analytics.TrackBatchAsync(new[] {
new AnalyticsEvent { Name = "email_sent", Properties = new() { ["template"] = "welcome" }, UserId = "user_123" },
new AnalyticsEvent { Name = "cron_completed", Properties = new() { ["job"] = "cleanup", ["duration"] = 1200 } },
});
admin.analytics.track("user_upgraded", { "plan" => "pro", "amount" => 29.99 }, user_id: "user_123")
admin.analytics.track_batch([
{ "name" => "email_sent", "properties" => { "template" => "welcome" }, "userId" => "user_123" },
{ "name" => "cron_completed", "properties" => { "job" => "cleanup", "duration" => 1200 } }
])
analytics = EdgeBaseAdmin.analytics(admin)
EdgeBaseAdmin.Analytics.track!(analytics, "user_upgraded", %{"plan" => "pro", "amount" => 29.99}, "user_123")
EdgeBaseAdmin.Analytics.track_batch!(analytics, [
%{"name" => "email_sent", "properties" => %{"template" => "welcome"}, "userId" => "user_123"},
%{"name" => "cron_completed", "properties" => %{"job" => "cleanup", "duration" => 1200}}
])
Track Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Event name (e.g., 'purchase', 'signup') |
properties | object | No | Key-value data (max 50 keys, 4 KB) |
userId | string | No | Associate with a specific user |
Querying Events
List Events
- TypeScript
- Dart
- Kotlin
- Java
- Scala
- Python
- Go
- PHP
- Rust
- C#
- Ruby
- Elixir
const result = await admin.analytics.queryEvents({
metric: 'list',
event: 'purchase',
range: '7d',
limit: 20,
});
console.log(result.events);
final result = await admin.analytics.queryEvents({
'metric': 'list',
'event': 'purchase',
'range': '7d',
'limit': '20',
});
print(result['events']);
val result = admin.analytics.queryEvents(
mapOf("metric" to "list", "event" to "purchase", "range" to "7d", "limit" to "20")
)
println(result)
Object result = admin.analytics().queryEvents(Map.of(
"metric", "list",
"event", "purchase",
"range", "7d",
"limit", "20"
));
System.out.println(result);
val result = admin.analytics.queryEvents(
Map("metric" -> "list", "event" -> "purchase", "range" -> "7d", "limit" -> "20")
)
println(result)
result = admin.analytics().query_events(metric="list", event="purchase", range="7d", limit=20)
print(result["events"])
import "context"
ctx := context.Background()
result, _ := admin.Analytics().QueryEvents(ctx, map[string]string{
"metric": "list",
"event": "purchase",
"range": "7d",
"limit": "20",
})
fmt.Println(result["events"])
$result = $admin->analytics()->queryEvents([
'metric' => 'list',
'event' => 'purchase',
'range' => '7d',
'limit' => '20',
]);
var_dump($result['events']);
use std::collections::HashMap;
let result = admin.analytics().query_events(Some(HashMap::from([
("metric".to_string(), "list".to_string()),
("event".to_string(), "purchase".to_string()),
("range".to_string(), "7d".to_string()),
("limit".to_string(), "20".to_string()),
]))).await?;
println!("{:?}", result.get("events"));
var result = await admin.Analytics.QueryEventsAsync(new Dictionary<string, string> {
["metric"] = "list",
["event"] = "purchase",
["range"] = "7d",
["limit"] = "20",
});
Console.WriteLine(result["events"]);
result = admin.analytics.query_events(
"metric" => "list",
"event" => "purchase",
"range" => "7d",
"limit" => "20"
)
pp result["events"]
result =
admin
|> EdgeBaseAdmin.analytics()
|> EdgeBaseAdmin.Analytics.query_events!(
metric: "list",
event: "purchase",
range: "7d",
limit: "20"
)
IO.inspect(result["events"])
Query Options
| Parameter | Type | Default | Description |
|---|---|---|---|
metric | string | 'list' | 'list', 'count', 'timeSeries', 'topEvents' |
range | string | '24h' | Time range: '1h', '6h', '24h', '7d', '30d', '90d' |
event | string | — | Filter by event name |
userId | string | — | Filter by user ID |
groupBy | string | 'hour' | For timeSeries: 'minute', 'hour', 'day' |
limit | number | 50 | Max events per page (for list) |
cursor | string | — | Pagination cursor (from previous response) |