メインコンテンツまでスキップ

custom-span-for-trace

Last updated on June 12, 2025

Overview

This guide outlines how to implement user-defined trace spans within Extend app, enabling then creation of custom spans and attributes that reflect specific application logic, workflows, or business processes. This allows for fine-grained visibility into Extend app's behavior.

By default, Extend app is using OpenTelemetry SDK to facilitates tracing capability.

How to add user defined span

  1. Inside the grpc service implementation class (eg. Services/MyService.cs in Extend Service Extension), add a private field for tracer component and initialize it using dependency injection.
...

using OpenTelemetry.Trace;

...
public public class MyService : Service.ServiceBase
{
...

private readonly Tracer _Tracer;

...

public MyService(
ILogger<MyService> logger,
IAccelByteServiceProvider abProvider,
Tracer tracer)
{
_Logger = logger;
_ABProvider = abProvider;
_Tracer = tracer;
}

...
}
  1. Then inside one of the method implementation (eg. CreateOrUpdateGuildProgress in Extend Service Extension), create an active span object. After adding some application logic, do not forget to end the span.
...
public override Task<CreateOrUpdateGuildProgressResponse> CreateOrUpdateGuildProgress(CreateOrUpdateGuildProgressRequest request, ServerCallContext context)
{
...
var mySpan = _Tracer.StartActiveSpan("<span name>");

// <write some application logic here>

mySpan.End();
...
}
...

How to add nested span

To add a child span under current active span, just start new active span before current active span ended. It is recommended to start a child span inside its own method together with the sub application logic.


private void MySubLogic(Tracer tracer)
{
var childSpan = tracer.StartActiveSpan("<child span name>");

// <write some application logic here>

childSpan.End();
}

// then in parent span, call the method
...

var mySpan = _Tracer.StartActiveSpan("<span name>");

// <write some application logic here>

MySubLogic(_Tracer);

mySpan.End();

...

If separate method is not desired, wrap child span inside an using block.

    ...

var mySpan = _Tracer.StartActiveSpan("<span name>");

// <write some application logic here>

using (var childSpan = tracer.StartActiveSpan("<child span name>"))
{
// <write some other application logic here>

childSpan.End();
}

mySpan.End();

...

How to add span's event

An event inside a span can be added by using AddEvent method in span object. This method must be called before End method is called.

var mySpan = _Tracer.StartActiveSpan("<span name>");

//add event
mySpan.AddEvent("<event description>");

How to set status for a span

A span status can be specified before ending the span itself.

var mySpan = _Tracer.StartActiveSpan("<span name>");

//set span status to error
mySpan.SetStatus(OpenTelemetry.Trace.Status.Error);

Resources