Extendアプリのカスタムメトリクス
このページは AI によって翻訳されています。内容の正確性については英語版を参照してください。
Overview
Extendアプリのカスタムメトリクスとは、Extendアプリが公開するデフォルトのメトリクス以外に追加できるメトリクスです。
この記事では、Extend Service Extensionアプリテンプレートを例に、Extendアプリにカスタムメトリクスを追加する手順を説明します。ただし、ここで説明する手順はすべての種類のExtendアプリに適用できます。
前提条件
このウォークスルーを進める前に、Extend Service Extensionアプリのセットアップ方法について理解しておく必要があります。
アプリテンプレートをクローンする
- C#
- Go
- Java
- Python
git clone https://github.com/AccelByte/extend-service-extension-csharp
git clone https://github.com/AccelByte/extend-service-extension-go
git clone https://github.com/AccelByte/extend-service-extension-java
git clone https://github.com/AccelByte/extend-service-extension-python
カスタムメトリクスを追加する
この例では、GetGuildProgress関数が呼び出された回数を追跡するカウンターメトリクスを追加します。
- C#
- Go
- Java
- Python
-
メトリクスプロバイダークラスを作成して、新しいメトリクスを定義します。
Classesディレクトリまたは他の任意のディレクトリに保存します。using System;
using Prometheus;
namespace AccelByte.Extend.ServiceExtension.Server
{
public class GetGuildCountMetric
{
private Counter _Counter;
public GetGuildCountMetric()
{
_Counter = Metrics.CreateCounter(
"ab_count_get_guild_progress",
"Count number of GetGuildProgress called", labelNames: new[] { "method" });
}
public void Increment(string method)
{
_Counter.WithLabels(method).Inc();
}
}
} -
Program.csファイル内のサービスプロバイダーに新しいメトリクスを登録します。以下のコードは、grpcサービスを登録する前に配置してください。...
builder.Services
.AddSingleton(new GetGuildCountMetric());
... -
Services/MyService.cs内のgrpcサービスコンストラクタに新しいメトリクスを追加します。...
public class MyService : Service.ServiceBase
{
...
private readonly GetGuildCountMetric _GetGuildCountMetric;
...
public MyService(
ILogger<MyService> logger,
IAccelByteServiceProvider abProvider,
Tracer tracer,
GetGuildCountMetric getGuildCountMetric)
{
...
_GetGuildCountMetric = getGuildCountMetric;
}
...
} -
GetGuildProgress関数が呼び出されるたびに、メトリクスカウンターをインクリメントします。_GetGuildCountMetric.Increment("GET", context.Method);
-
Prometheusの
CounterVecを作成し、main.go内のcounterGetGuildProgress変数に格納することで、新しいメトリクスを定義します。このメトリクスにはmethodという1つのラベルが含まれます。var (
serviceName = common.GetEnv("OTEL_SERVICE_NAME", "ExtendCustomServiceGoDocker")
logLevelStr = common.GetEnv("LOG_LEVEL", logrus.InfoLevel.String())
// 新しい変数
counterGetGuildProgress = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "ab_count_get_guild_progress",
Help: "Count number of GetGuildProgress called",
},
[]string{"method"},
)
) -
main.go内で、Prometheusレジストリに
counterGetGuildProgress変数を登録します。// Prometheusメトリクスを登録
prometheusRegistry := prometheus.NewRegistry()
prometheusRegistry.MustRegister(
prometheusCollectors.NewGoCollector(),
prometheusCollectors.NewProcessCollector(prometheusCollectors.ProcessCollectorOpts{}),
prometheusGrpc.DefaultServerMetrics,
// 新しいカスタムメトリクス
counterGetGuildProgress,
) -
counterGetGuildProgress変数をGetGuildProgress関数に渡します。pkg/service/myService.go内のMyServiceServerImpl構造体に、カスタムメトリクスを保持する新しいフィールドを追加します。さらに、MyServiceServerImplの新しいインスタンスを作成する際にcounterGetGuildProgressを初期化するよう、コンストラクタを更新します。type MyServiceServerImpl struct {
pb.UnimplementedServiceServer
tokenRepo repository.TokenRepository
configRepo repository.ConfigRepository
refreshRepo repository.RefreshTokenRepository
storage storage.Storage
counterGetGuildProgress prometheus.CounterVec // 新しいフィールド
}
func NewMyServiceServer(
tokenRepo repository.TokenRepository,
configRepo repository.ConfigRepository,
refreshRepo repository.RefreshTokenRepository,
storage storage.Storage,
counterGetGuildProgress prometheus.CounterVec, // 新しく追加
) *MyServiceServerImpl {
return &MyServiceServerImpl{
tokenRepo: tokenRepo,
configRepo: configRepo,
refreshRepo: refreshRepo,
storage: storage,
counterGetGuildProgress: counterGetGuildProgress, // 新しく追加
}
} -
GetGuildProgress関数が呼び出されるたびに、メトリクスカウンターをインクリメントします。func (g MyServiceServerImpl) GetGuildProgress(
ctx context.Context, req *pb.GetGuildProgressRequest,
) (*pb.GetGuildProgressResponse, error) {
namespace := req.Namespace
guildProgressKey := fmt.Sprintf("guildProgress_%s", req.GuildId)
// カスタムメトリクスを呼び出す
g.counterGetGuildProgress.WithLabelValues("GET").Inc()
guildProgress, err := g.storage.GetGuildProgress(namespace, guildProgressKey)
if err != nil {
return nil, status.Errorf(codes.Internal, "Error getting guild progress: %v", err)
}
return &pb.GetGuildProgressResponse{
GuildProgress: guildProgress,
}, nil
}
-
build.gradleファイルにspring-aspects依存関係を追加します。dependencies {
...
implementation 'org.springframework:spring-aspects:6.1.4'
...
testImplementation 'org.springframework:spring-aspects:6.1.4'
} -
src/main/java/net/accelbyte/extend/serviceextension/config/AppConfig.javaファイルにCountedAspectを追加します。...
import io.micrometer.core.aop.CountedAspect;
import io.micrometer.core.instrument.MeterRegistry;
@Configuration
public class AppConfig {
...
@Bean
public CountedAspect provideCounterAspect(MeterRegistry registry) {
return new CountedAspect(registry);
}
} -
src/main/java/net/accelbyte/extend/serviceextension/service/MyService.javaファイルのgetGuildProgressメソッドに@Countedアノテーションを追加します。...
import io.micrometer.core.annotation.Counted;
@GRpcService
@Slf4j
public class MyService extends ServiceGrpc.ServiceImplBase {
@Counted(value = "ab_count_get_guild_progress",
description = "Count number of GetGuildProgress called",
extraTags = { "method", "GET" })
@Override
public void getGuildProgress(
GetGuildProgressRequest request, StreamObserver<GetGuildProgressResponse> responseObserver
) {
...
}
}
-
Prometheusの
Counterを作成し、サービスの.pyファイル内のcounter_get_guild_progress変数に格納することで、新しいメトリクスを定義します。このメトリクスにはmethodという1つのラベルが含まれます。from prometheus_client import Counter
class AsyncMyService(MyServiceServices):
def __init__(self, *args, **kwargs) -> None:
self.counter_get_guild_progress = Counter(
name="ab_count_get_guild_progress",
documentation="Count number of GetGuildProgress called",
labelnames=["method"],
unit="count",
) -
GetGuildProgress関数が呼び出されるたびに、メトリクスカウンターをインクリメントします。async def GetGuildProgress(
self, request: GetGuildProgressRequest, context: Any
) -> GetGuildProgressResponse:
# ...
self.counter_get_guild_progress.labels(method="GET").inc(amount=1)
# ...
Grafanaでメトリクスを確認する
-
Admin Portalの該当Extendアプリの詳細ページにある Open Grafana ボタンをクリックして、Grafanaにアクセスします。
-
Grafana内で Explore メニューをクリックします。

-
メトリクスデータをロードするデータソースを選択します。
Admin Portalでのアカウント権限に応じて、選択できるPrometheusデータソースは2種類あります。すべてのネームスペースにアクセスできる場合(スーパー管理者)は、
metricsデータソース(ネームスペース横断データ)を選択できます。特定のネームスペースのみにアクセスできる場合は、prom-<namespace>.*データソース(ネームスペース単位のデータ)のみを選択できます。ネームスペース横断データ ネームスペース単位のデータ -
必要に応じて複数のクエリを追加または削除します。データソースを選択したら、Add queryボタンをクリックします。また、GrafanaではQuery historyボタンをクリックすることでクエリ履歴を確認できます。

-
カスタムメトリクスを選択するには、
Select metricドロップダウンを使用してカスタムメトリクスを検索します。また、Operationsボタンをクリックして特定の演算を適用することもできます。
複雑なクエリを使用する場合は、
Codeタブをクリックすると、高度な計算のためにPrometheusクエリを使用できます。
以下の画像の手順に従ってください。まず、データソースを選択します(1)。次に、クエリの時間範囲を選択します(2)。続いて、
MetricドロップダウンボックスとLabelフィルターから値を選択します(3)。必要に応じて、メトリクスに特定の演算を適用します(4)。最後に、Run queryボタンをクリックしてメトリクスを表示します。
重要な注意事項
-
シリーズとは、メトリクス名とラベルのキーと値のペアの組み合わせによって一意に定義されるものです。メトリクス名とラベルのキーと値のペアの組み合わせが異なれば、それぞれ別のシリーズとして扱われます。 例:
ab_count_get_guild_progress{method="GET"} 1 -> series_count=1
ab_count_get_guild_progress{method="GET"} 5 -> series_count=1
ab_count_get_guild_progress{method="POST"} 5 -> series_count=2
ab_sum_get_guild_progress{method="GET", service="guild"} 1 -> series_count=3 -
カスタムメトリクスは、環境ごとに最大1,000のアクティブシリーズに制限されています。この上限に達すると、新しいシリーズをプッシュできなくなります。
a. 可観測性プラットフォームが継続的にスクレイプして受信しているメトリクスは、アクティブシリーズとみなされます。
b. 可観測性プラットフォームが20分間スクレイプも受信もしなかったメトリクスは、非アクティブシリーズとみなされます。
-
現在、メトリクスを表示するためのカスタムダッシュボードを作成することはできません。
-
カスタムメトリクスを含むExtendアプリのメトリクスは、ポート8080の
/metricsエンドポイントで公開されます。この設定は、Extendアプリテンプレートを使用してExtendアプリを作成する際にデフォルトで設定されます。 -
以下の表は、カスタムメトリクスで使用できない予約済みラベルを示しています。これらのいずれかが使用された場合、事前定義された値に置き換えられます。
ラベルキー 値 説明 environment_name ${env_name}環境識別子名 product extend プロダクト識別子名: extend scenario ${extend_app_type}Extendアプリのタイプ: function-override、event-handler、またはservice-extensionunion_namespace ${publisher_name}パブリッシャー名 game_namespace ${game_namespace}Extendアプリのネームスペース app_name ${app_name}Extendアプリ名 job metric-services/extend-metrics 事前定義されたジョブ名 instance extend-metric-instance 事前定義されたインスタンス値
デフォルトのメトリクスと区別しやすくするために、カスタムメトリクスに一意のプレフィックスを付けてください。例えば、ab_count_get_guild_progressでは、ab_が一意の識別子プレフィックスとして機能します。