forked from signalfx/microservices-demo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCartServiceImpl.cs
132 lines (114 loc) · 4.43 KB
/
CartServiceImpl.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright 2018 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using cartservice.interfaces;
using Grpc.Core;
using Hipstershop;
using static Hipstershop.CartService;
using OpenTracing;
using OpenTracing.Propagation;
using OpenTracing.Util;
using System.Collections;
namespace cartservice
{
// Cart wrapper to deal with grpc communication
internal class CartServiceImpl : CartServiceBase
{
private ITracer tracer;
private ICartStore cartStore;
private readonly static Empty Empty = new Empty();
private static readonly Func<Grpc.Core.Metadata, string, IEnumerable<string>> Getter =
(md, key) =>
{
List<string> result = new List<string>();
foreach (var item in md.GetAll(key.ToLower()))
{
result.Add(item.Value);
}
return result;
};
public CartServiceImpl(ICartStore cartStore)
{
this.cartStore = cartStore;
this.tracer = GlobalTracer.Instance;
}
public ISpanContext TraceContextFromGrpcContext(Grpc.Core.ServerCallContext context)
{
var carrier = new MetadataCarrier(context.RequestHeaders);
return this.tracer.Extract(BuiltinFormats.HttpHeaders, carrier);
}
public async override Task<Empty> AddItem(AddItemRequest request, Grpc.Core.ServerCallContext context)
{
using (IScope scope = this.tracer.BuildSpan("AddItem").AsChildOf(this.TraceContextFromGrpcContext(context)).StartActive())
{
ISpan span = scope.Span;
span.SetTag("span.kind", "server");
span.SetTag("component", "rpc");
span.SetTag("grpc.method", "/hipstershop.CartService/AddItem");
await cartStore.AddItemAsync(request.UserId, request.Item.ProductId, request.Item.Quantity);
return Empty;
}
}
public async override Task<Empty> EmptyCart(EmptyCartRequest request, ServerCallContext context)
{
using (IScope scope = this.tracer.BuildSpan("EmptyCart").AsChildOf(this.TraceContextFromGrpcContext(context)).StartActive())
{
ISpan span = scope.Span;
span.SetTag("span.kind", "server");
span.SetTag("component", "rpc");
span.SetTag("grpc.method", "/hipstershop.CartService/EmptyCart");
await cartStore.EmptyCartAsync(request.UserId);
return Empty;
}
}
public override Task<Hipstershop.Cart> GetCart(GetCartRequest request, ServerCallContext context)
{
using (IScope scope = this.tracer.BuildSpan("GetCart").AsChildOf(this.TraceContextFromGrpcContext(context)).StartActive())
{
ISpan span = scope.Span;
span.SetTag("span.kind", "server");
span.SetTag("component", "rpc");
span.SetTag("grpc.method", "/hipstershop.CartService/GetCart");
return cartStore.GetCartAsync(request.UserId);
}
}
}
internal class MetadataCarrier : ITextMap
{
private readonly Metadata _metadata;
public MetadataCarrier(Metadata metadata)
{
_metadata = metadata;
}
public void Set(string key, string value)
{
_metadata.Add(key, value);
}
public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
{
foreach (var entry in _metadata)
{
if (entry.IsBinary)
continue;
yield return new KeyValuePair<string, string>(entry.Key, entry.Value);
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}