Skip to content

Commit 2debc80

Browse files
konardclaude
andcommitted
Add request tracking ID logging for Tinkoff API calls
- Modified PlaceBuyOrder to log x-tracking-id header from PostOrderAsync - Modified PlaceSellOrder to log x-tracking-id header from PostOrderAsync - Modified CancelOrder to log x-tracking-id header from CancelOrderAsync - Added example demonstrating tracking ID extraction and logging - Tracking IDs are essential for efficient communication with Tinkoff support 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 04bf2d9 commit 2debc80

File tree

2 files changed

+75
-3
lines changed

2 files changed

+75
-3
lines changed

csharp/TraderBot/TradingService.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -826,8 +826,17 @@ private async Task<PostOrderResponse> PlaceSellOrder(long amount, decimal price)
826826
// {
827827
// throw new InvalidOperationException($"Not enough amount to sell {amount} assets. Available amount: {securityPosition.Balance}");
828828
// }
829-
var response = await InvestApi.Orders.PostOrderAsync(sellOrderRequest).ResponseAsync;
829+
using var call = InvestApi.Orders.PostOrderAsync(sellOrderRequest);
830+
var headers = await call.ResponseHeadersAsync;
831+
var response = await call.ResponseAsync;
832+
833+
var trackingId = headers.GetValue("x-tracking-id");
830834
Logger.LogInformation($"Sell order placed: {response}");
835+
if (!string.IsNullOrEmpty(trackingId))
836+
{
837+
Logger.LogInformation($"Tinkoff request tracking ID: {trackingId}");
838+
}
839+
831840
return response;
832841
}
833842

@@ -847,21 +856,39 @@ private async Task<PostOrderResponse> PlaceBuyOrder(long amount, decimal price)
847856
// {
848857
// throw new InvalidOperationException($"Not enough money to buy {CurrentInstrument.Figi} asset.");
849858
// }
850-
var response = await InvestApi.Orders.PostOrderAsync(buyOrderRequest).ResponseAsync;
859+
using var call = InvestApi.Orders.PostOrderAsync(buyOrderRequest);
860+
var headers = await call.ResponseHeadersAsync;
861+
var response = await call.ResponseAsync;
862+
863+
var trackingId = headers.GetValue("x-tracking-id");
851864
var total = amount * price;
852865
SetCashBalance(CashBalanceFree - total, CashBalanceLocked + total);
853866
Logger.LogInformation($"Buy order placed: {response}");
867+
if (!string.IsNullOrEmpty(trackingId))
868+
{
869+
Logger.LogInformation($"Tinkoff request tracking ID: {trackingId}");
870+
}
871+
854872
return response;
855873
}
856874

857875
private async Task<CancelOrderResponse> CancelOrder(string orderId)
858876
{
859-
var response = await InvestApi.Orders.CancelOrderAsync(new CancelOrderRequest
877+
using var call = InvestApi.Orders.CancelOrderAsync(new CancelOrderRequest
860878
{
861879
AccountId = CurrentAccount.Id,
862880
OrderId = orderId,
863881
});
882+
var headers = await call.ResponseHeadersAsync;
883+
var response = await call.ResponseAsync;
884+
885+
var trackingId = headers.GetValue("x-tracking-id");
864886
Logger.LogInformation($"Order cancelled: {response}");
887+
if (!string.IsNullOrEmpty(trackingId))
888+
{
889+
Logger.LogInformation($"Tinkoff request tracking ID: {trackingId}");
890+
}
891+
865892
return response;
866893
}
867894

examples/TrackingIdExample.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System;
2+
using Grpc.Core;
3+
using Microsoft.Extensions.Logging;
4+
5+
namespace TraderBot.Examples
6+
{
7+
/// <summary>
8+
/// This example demonstrates how the tracking ID logging would work
9+
/// when the Tinkoff API returns the x-tracking-id header
10+
/// </summary>
11+
public class TrackingIdExample
12+
{
13+
private readonly ILogger<TrackingIdExample> _logger;
14+
15+
public TrackingIdExample(ILogger<TrackingIdExample> logger)
16+
{
17+
_logger = logger;
18+
}
19+
20+
/// <summary>
21+
/// Example of how tracking ID is extracted and logged
22+
/// This simulates what happens in the actual PlaceBuyOrder/PlaceSellOrder/CancelOrder methods
23+
/// </summary>
24+
public void SimulateTrackingIdLogging()
25+
{
26+
// Simulate a response with x-tracking-id header
27+
var metadata = new Metadata
28+
{
29+
{ "x-tracking-id", "550e8400-e29b-41d4-a716-446655440000" }
30+
};
31+
32+
// Extract tracking ID (as done in the actual implementation)
33+
var trackingId = metadata.GetValue("x-tracking-id");
34+
35+
// Log the tracking ID (as done in the actual implementation)
36+
_logger.LogInformation($"Buy order placed: [order response details]");
37+
if (!string.IsNullOrEmpty(trackingId))
38+
{
39+
_logger.LogInformation($"Tinkoff request tracking ID: {trackingId}");
40+
}
41+
42+
Console.WriteLine($"Tracking ID logged: {trackingId}");
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)