Recommended
PDF
How to Make Own Framework built on OWIN
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
PDF
MagicOnion~C#でゲームサーバを開発しよう~
PDF
Multipeer connectivityを使った 動画のリアルタイム端末間共有
PDF
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
PPTX
Using or not using magic onion
PDF
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
PDF
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
PDF
The Usage and Patterns of MagicOnion
PDF
Introduction to NotifyPropertyChangedGenerator
PDF
UniRx - Reactive Extensions for Unity
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
LightNode - Micro RPC/REST Framework
PDF
Building the Game Server both API and Realtime via c#
PDF
NextGen Server/Client Architecture - gRPC + Unity + C#
PDF
PDF
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
PDF
The History of Reactive Extensions
PDF
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
PDF
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
PDF
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
PDF
A quick tour of the Cysharp OSS
PDF
20190604 Containerized MagicOnion on kubernetes with Observability with New R...
PDF
LINQPad with LINQ to BigQuery - Desktop Client for BigQuery
PDF
linq.js - Linq to Objects for JavaScript
PDF
PDF
A Framework for LightUp Applications of Grani
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
More Related Content
PDF
How to Make Own Framework built on OWIN
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
PDF
MagicOnion~C#でゲームサーバを開発しよう~
PDF
Multipeer connectivityを使った 動画のリアルタイム端末間共有
PDF
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
PPTX
Using or not using magic onion
PDF
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
PDF
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
What's hot
PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
PDF
The Usage and Patterns of MagicOnion
PDF
Introduction to NotifyPropertyChangedGenerator
PDF
UniRx - Reactive Extensions for Unity
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
LightNode - Micro RPC/REST Framework
PDF
Building the Game Server both API and Realtime via c#
PDF
NextGen Server/Client Architecture - gRPC + Unity + C#
PDF
PDF
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
PDF
The History of Reactive Extensions
PDF
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
PDF
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
PDF
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
PDF
A quick tour of the Cysharp OSS
PDF
20190604 Containerized MagicOnion on kubernetes with Observability with New R...
PDF
LINQPad with LINQ to BigQuery - Desktop Client for BigQuery
PDF
linq.js - Linq to Objects for JavaScript
PDF
PDF
A Framework for LightUp Applications of Grani
More from Yoshifumi Kawai
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PDF
Deep Dive async/await in Unity with UniTask(EN)
PDF
Photon Server Deep Dive - View from Implmentation of PhotonWire, Multiplayer ...
PDF
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
PDF
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
PDF
Memory Management of C# with Unity Native Collections
PPTX
RuntimeUnitTestToolkit for Unity(English)
PDF
Deep Dive async/await in Unity with UniTask(UniRx.Async)
PDF
PDF
How to make the Fastest C# Serializer, In the case of ZeroFormatter
PDF
History & Practices for UniRx(EN)
PDF
A Brief History of UniRx/UniTask, IUniTaskSource in Depth
PDF
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
PPTX
RuntimeUnitTestToolkit for Unity
PPTX
Clash of Oni Online - VR Multiplay Sword Action
Recently uploaded
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):コアマイクロシステムズ株式会社 テーマ 「AI HPC時代のトータルソリューションプロバイダ」
PPTX
ChatGPTのコネクタ開発から学ぶ、外部サービスをつなぐMCPサーバーの仕組み
PDF
論文紹介:DiffusionRet: Generative Text-Video Retrieval with Diffusion Model
PDF
論文紹介:HiLoRA: Adaptive Hierarchical LoRA Routing for Training-Free Domain Gene...
PDF
論文紹介:MotionMatcher: Cinematic Motion Customizationof Text-to-Video Diffusion ...
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):日本ヒューレット・パッカード合同会社 テーマ1「大規模AIの能力を最大限に活用するHPE Comp...
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):Pacific Teck Japan テーマ3「『TrinityX』 AI時代のクラスターマネジメ...
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):Pacific Teck Japan テーマ2「『Slinky』 SlurmとクラウドのKuber...
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):エヌビディア合同会社 テーマ1「NVIDIA 最新発表製品等のご案内」
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):日本ヒューレット・パッカード合同会社 テーマ3「IT運用とデータサイエンティストを強力に支援するH...
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):富士通株式会社 テーマ1「HPC&AI: Accelerating material develo...
PPTX
2025年11月24日情報ネットワーク法学会大井哲也発表「API利用のシステム情報」
PDF
AI開発の最前線を変えるニューラルネットワークプロセッサと、未来社会における応用可能性
PDF
ニューラルプロセッサによるAI処理の高速化と、未知の可能性を切り拓く未来の人工知能
PDF
膨大なデータ時代を制する鍵、セグメンテーションAIが切り拓く解析精度と効率の革新
Implements OpenTelemetry Collector in DotNet 2. 河合 宜文 / Kawai Yoshifumi / @neuecc
Cysharp, Inc.
Cygames
C#大統一理論
C#
4. Unified Realtime/API Engine for .NET Core and Unity
https://github.com/Cysharp/MagicOnion/
gRPCベースのC#特化ネットワークフレームワーク
.NET Core(Server) - Unity(Client)における
ハイパフォーマンスなAPI通信とリアルタイム通信を実現
gRPCなのにProtocol Buffersを使わない(スキーマ共有としてC#
コードそのものをサーバー/クライアントでシェアする)という
C#ファーストな設計(シリアライズ自体はMessagePackで行う)
5. public class TestService : ITestService
{
public async UnaryResult<int> Sum(int x, int y)
{
return x + y;
}
}
var client = MagicOnionClient.Create<ITestService>(channel);
var result = await client.Sum(100, 200);
public interface ITestService
{
UnaryResult<int> Sum(int x, int y);
}
Share Service Definition(and
Requst/Response Message) written in C#
Server Implementation
Client Implementation
7. 8. 9. 10. 11. 12. public class OpenTelemetryCollectorFilter : MagicOnionFilterAttribute
{
public override async ValueTask Invoke(ServiceContext context)
{
try
{
// ここに前処理
await Next(context);
// ここに正常時処理
}
catch (Exception ex)
{
// ここに例外時処理
}
finally
{
// ここに後処理
}
}
}
MagicOnionではFilterとしてリクエスト前後のフック
ポイントを用意しているので、これに引っ掛ける
13. var tracer = context.ServiceLocator.GetService<ITracer>();
var sampler = context.ServiceLocator.GetService<ISampler>();
var spanBuilder = tracer.SpanBuilder(context.CallContext.Method, SpanKind.Server);
if (sampler != null)
{
spanBuilder.SetSampler(sampler);
}
using (spanBuilder.StartScopedSpan(out var span))
{
try
{
span.SetAttribute("component", "grpc");
span.SetAttribute("request.size", context.GetRawRequest().LongLength);
await Next(context);
// 次ページに続く
ITracerとISamplerを取得(これは
MagicOnionのDIより。取得方法は
なんでもいい)
名前をつけてSpanを作る。フレー
ムワークのルートなのでルートで
しょという扱い(分散トレーシン
グ対応する場合は親の設定などが
必要ですが今回は割愛)
名前はサービスメソッド名(gRPC
なのでTestService/Sumなどになる)
14. var tracer = context.ServiceLocator.GetService<ITracer>();
var sampler = context.ServiceLocator.GetService<ISampler>();
var spanBuilder = tracer.SpanBuilder(context.CallContext.Method, SpanKind.Server);
if (sampler != null)
{
spanBuilder.SetSampler(sampler);
}
using (spanBuilder.StartScopedSpan(out var span))
{
try
{
span.SetAttribute("component", "grpc");
span.SetAttribute("request.size", context.GetRawRequest().LongLength);
await Next(context);
// 次ページに続く
Trace処理は軽い処理ではないので、間引く
場合はSamplerを渡せば、それのルール
(1/10の確率、とか)に則って処理される
スコープで囲んでいる範囲が自分のSpanにぶら
下がる雰囲気になる。サービスフレームワーク
なのでリクエスト開始から完了までを囲む
SetAttributeでSpanに情報を付与。この場合
gRPCですよ、とかリクエストサイズは何
バイトとでしたよ、とか。命名は自由、に
みえて仕様である程度は決まってる。
15. using (spanBuilder.StartScopedSpan(out var span))
{
try
{
// 中略
await Next(context);
span.SetAttribute(“response.size”, context.GetRawResponse().LongLength);
span.SetAttribute(“status_code”, (long)context.CallContext.Status.StatusCode);
span.Status = ConvertStatus(context.CallContext.Status.StatusCode)
.WithDescription(context.CallContext.Status.Detail);
}
catch (Exception ex)
{
span.SetAttribute(“exception”, ex.ToString());
span.SetAttribute(“status_code”, (long)context.CallContext.Status.StatusCode);
span.Status = ConvertStatus(context.CallContext.Status.StatusCode)
.WithDescription(context.CallContext.Status.Detail);
}
}
ステータスコードの指定。このステータスコード
はgRPCと一緒(と、仕様に書いてある)で、
Ok, Unknown, NotFoundなどがある
16. MagicOnionではIMagicOnionLoggerとして構造化ログ
の口を用意しているので、これを用いる。
public interface IMagicOnionLogger
{
void BeginBuildServiceDefinition();
void EndBuildServiceDefinition(double elapsed);
void BeginInvokeMethod(ServiceContext context, byte[] request, Type type);
void EndInvokeMethod(ServiceContext context, byte[] response, Type type, double elapsed,
void BeginInvokeHubMethod(StreamingHubContext context, ArraySegment<byte> request, Type t
void EndInvokeHubMethod(StreamingHubContext context, int responseSize, Type type, double
void InvokeHubBroadcast(string groupName, int responseSize, int broadcastGroupCount);
void WriteToStream(ServiceContext context, byte[] writeData, Type type);
void ReadFromStream(ServiceContext context, byte[] readData, Type type, bool complete);
}
17. public class OpenTelemetryCollectorLogger : IMagicOnionLogger
{
static readonly IMeasureDouble UnaryElapsed = MeasureDouble.Create
("MagicOnion/measure/UnaryElapsed", "Unary API elapsed time.", "ms");
static readonly IMeasureLong UnaryResponseSize = MeasureLong.Create
("MagicOnion/measure/UnaryResponseSize", "Unary API response size.", "
static readonly IMeasureLong UnaryErrorCount = MeasureLong.Create
("MagicOnion/measure/UnaryErrorCount", "Unary API error Count.", "num"
static readonly TagKey MethodKey = TagKey.Create("MagicOnion/keys/Method");
readonly IStatsRecorder statsRecorder;
readonly ITagger tagger;
readonly ITagContext defaultTags;
public OpenTelemetryCollectorLogger(IStatsRecorder statsRecorder, ITagger tagger, ITagConte
{
this.statsRecorder = statsRecorder;
this.tagger = tagger;
this.defaultTags = defaultTags ?? TagContext.Empty;
}
// 実装は次ページ
}
メトリックに使うKeyの類は事前用意
使う型はIStatsRecorderとITagger
18. public class OpenTelemetryCollectorLogger : IMagicOnionLogger
{
ITagContext CreateTag(ServiceContext context)
{
return tagger.ToBuilder(defaultTags)
.Put(MethodKey, TagValue.Create(context.CallContext.Method)).Build();
}
public void EndInvokeMethod(ServiceContext context, byte[] response,
Type type, double elapsed, bool isErrorOrInterrupted)
{
var map = statsRecorder.NewMeasureMap();
map.Put(UnaryElapsed, elapsed);
map.Put(UnaryResponseSize, response.LongLength);
if (isErrorOrInterrupted)
{
map.Put(UnaryErrorCount, 1);
}
map.Record(CreateTag(context));
}
// 他の実装は省略
}
MeasureMapを作って、値をPut。キーは事
前定義しているもの。
最後にTagと共にRecord。
ダッシュボード作りにはTagの設計が肝
要なのですが本題ではないので割愛
19. 20.