Chapter 39 · Launchdarkly Metric Instrument
Subchapter 39.1
references/sdk-track-patterns.mdMarkdown8 KBView on GitHub
How to call track() in each LaunchDarkly SDK. Use this reference to match the patterns already in use in the codebase — and to add the right call when starting fresh.
The key distinction across all SDKs: server-side SDKs require a context per call; client-side SDKs do not.
Package: @launchdarkly/node-server-sdk (v9+) or launchdarkly-node-server-sdk (v6–v8)
npm install @launchdarkly/node-server-sdkimport * as ld from '@launchdarkly/node-server-sdk';
const client = ld.init(process.env.LD_SDK_KEY!);
await client.waitForInitialization();
// Count / occurrence metric (no metricValue)
client.track('checkout-completed', context);
// Value metric — pass the measurement as metricValue
client.track('api-response-time', context, null, responseTimeMs);
// With custom data payload
client.track('item-purchased', context, { itemId: 'abc123', category: 'apparel' }, purchaseAmount);
// Flush explicitly in tests / short-lived processes
await client.flush();Package: launchdarkly-js-client-sdk
npm install launchdarkly-js-client-sdkimport * as ld from 'launchdarkly-js-client-sdk';
const client = ld.initialize(clientSideId, context);
await client.waitForInitialization();
// Count / occurrence metric — no context, no metricValue
client.track('signup-completed');
// Value metric
client.track('page-load-time', null, performanceMs);
// With custom data
client.track('item-added-to-cart', { itemId: 'abc123' }, itemPrice);
// Flush (useful in tests or before navigating away)
await client.flush();Package: launchdarkly-react-client-sdk
npm install launchdarkly-react-client-sdkimport { useLDClient } from 'launchdarkly-react-client-sdk';
function CheckoutButton() {
const ldClient = useLDClient();
const handleSubmit = async () => {
await processCheckout();
// Count / occurrence metric
ldClient?.track('checkout-completed');
// Value metric
ldClient?.track('checkout-revenue', null, orderTotal);
};
return <button onClick={handleSubmit}>Complete Order</button>;
}Initialization (typically in the app root via LDProvider or asyncWithLDProvider):
import { LDProvider } from 'launchdarkly-react-client-sdk';
// Wrap your app — context is set here, not in each track() call
<LDProvider clientSideID={clientSideId} context={userContext}>
<App />
</LDProvider>Package: launchdarkly-server-sdk
pip install launchdarkly-server-sdkimport ldclient
from ldclient.config import Config
ldclient.set_config(Config(sdk_key))
client = ldclient.get()
# Count / occurrence metric
client.track('checkout-completed', context)
# Value metric
client.track('api-response-time', context, None, response_time_ms)
# With data payload
client.track('item-purchased', context, {'item_id': 'abc123'}, purchase_amount)
# Flush
client.flush()Package: github.com/launchdarkly/go-server-sdk/v7
go get github.com/launchdarkly/go-server-sdk/v7import (
ld "github.com/launchdarkly/go-server-sdk/v7"
"github.com/launchdarkly/go-server-sdk/v7/ldcontext"
)
client, _ := ld.MakeClient(sdkKey, 5*time.Second)
defer client.Close()
// Count / occurrence metric
client.TrackEvent("checkout-completed", context)
// Value metric
client.TrackMetric("api-response-time", context, responseTimeMs, nil)
// With data payload
data := ldvalue.BuildObject().Set("itemId", ldvalue.String("abc123")).Build()
client.TrackData("item-purchased", context, data)Package: com.launchdarkly:launchdarkly-java-server-sdk
<!-- Maven -->
<dependency>
<groupId>com.launchdarkly</groupId>
<artifactId>launchdarkly-java-server-sdk</artifactId>
<version>7.x.x</version>
</dependency>LDClient client = new LDClient(sdkKey);
// Count / occurrence metric
client.track("checkout-completed", context);
// Value metric
client.trackMetric("api-response-time", context, responseTimeMs);
// With data payload
LDValue data = LDValue.buildObject().put("itemId", "abc123").build();
client.trackData("item-purchased", context, data);
client.trackMetric("item-purchased", context, purchaseAmount);
// Flush
client.flush();
client.close();Package: launchdarkly-server-sdk
gem install launchdarkly-server-sdkrequire 'ldclient-rb'
client = LaunchDarkly::LDClient.new(sdk_key)
# Count / occurrence metric
client.track('checkout-completed', context)
# Value metric
client.track('api-response-time', context, nil, response_time_ms)
# With data payload
client.track('item-purchased', context, { item_id: 'abc123' }, purchase_amount)
# Flush
client.flushPackage: LaunchDarkly.ServerSdk
dotnet add package LaunchDarkly.ServerSdkusing LaunchDarkly.Sdk;
using LaunchDarkly.Sdk.Server;
var client = new LdClient(sdkKey);
// Count / occurrence metric
client.Track("checkout-completed", context);
// Value metric
client.Track("api-response-time", context, LdValue.Null, responseTimeMs);
// With data payload
var data = LdValue.BuildObject().Add("itemId", "abc123").Build();
client.Track("item-purchased", context, data, purchaseAmount);
// Flush
client.Flush();Package: LaunchDarkly via Swift Package Manager or CocoaPods
import LaunchDarkly
// Context set during LDClient.start() — not required per track call
// Count / occurrence metric
LDClient.get()!.trackEvent(key: "checkout-completed")
// Value metric
LDClient.get()!.trackEvent(key: "api-response-time", metricValue: responseTimeMs)
// With data payload
LDClient.get()!.trackEvent(key: "item-purchased", data: ["itemId": "abc123"], metricValue: purchaseAmount)
// Flush
LDClient.get()!.flush()Package: com.launchdarkly:launchdarkly-android-client-sdk
// Context set during LDClient.init() — not required per track call
val client = LDClient.get()
// Count / occurrence metric
client.trackEvent("checkout-completed")
// Value metric
client.trackMetric("api-response-time", null, responseTimeMs)
// With data payload
val data = LDValue.buildObject().put("itemId", "abc123").build()
client.trackData("item-purchased", data, purchaseAmount)
// Flush
client.flush()Many teams abstract LaunchDarkly calls behind a service or utility. Search for these patterns before adding a raw ldClient.track() call:
// Service wrappers
analyticsService.track('event-key');
featureFlagService.trackEvent('event-key', context);
tracking.record('event-key', metricValue);
// Module-level wrappers
import { trackEvent } from '../lib/launchdarkly';
trackEvent('event-key', context, metricValue);
// Class-based
this.ldService.track('event-key');
LDWrapper.getInstance().track('event-key');If any of these exist, add the new call through the same wrapper — don’t bypass it.
| Metric type | Pass metricValue? | Example |
|---|---|---|
count | No — omit it | client.track('button-clicked', context) |
occurrence | No — omit it | client.track('signup-completed', context) |
value (average) | Yes — the measurement | client.track('page-load', context, null, 342) |
value (sum) | Yes — the per-event amount | client.track('revenue', context, null, 49.99) |
The data parameter (before metricValue) is for arbitrary metadata — order IDs, category names, etc. It does not affect metric calculations.