public async Task SendSingleAsync(HoneycombEvent ev) { _logger.LogTrace("Sending Honeycomb Data"); var client = _httpClientFactory.CreateClient("honeycomb"); var message = new HttpRequestMessage(); var content = JsonConvert.SerializeObject(ev.Data); message.Content = new StringContent(content, Encoding.UTF8, "application/json"); message.Method = HttpMethod.Post; message.RequestUri = new Uri($"https://api.honeycomb.io/1/events/{WebUtility.UrlEncode(ev.DataSetName)}"); message.Headers.UserAgent.Add( new ProductInfoHeaderValue( new ProductHeaderValue("libhoney-dotnet", _assemblyVersion))); message.Headers.Add("X-Honeycomb-Event-Time", ev.EventTime.ToUniversalTime().ToString(@"{0:yyyy-MM-ddTHH\:mm\:ss.fffK}")); message.Headers.Add("X-Honeycomb-Team", _settings.Value.TeamId); var resp = await client.SendAsync(message); if (!resp.IsSuccessStatusCode) { _logger.LogWarning("Error sending information to honeycomb status:{StatusCode}", resp.StatusCode); } }
public async Task Single() { _handler.ResponseMessages.Enqueue(new HttpResponseMessage { Content = new StringContent("") }); var events = new HoneycombEvent { Data = new Dictionary <string, object> { { "test", 2 } }, EventTime = new DateTime(2010, 10, 10), DataSetName = "blah" }; _honeycombService.QueueEvent(events); _handler.Messages.Count().ShouldBe(0); await _honeycombService.Flush(); _handler.Messages.Count().ShouldBe(1); var message = _handler.Messages[0]; message.RequestUri.AbsoluteUri.ShouldBe("https://api.honeycomb.io/1/batch/blah"); }
public async Task <HttpResponseMessage> SendAsync(string dataset, DateTime eventTime, HoneycombEvent honeycombEvent) { return(await SendHoneycombRequestAsync($"{EventsUri}{dataset}", eventTime, honeycombEvent) .ConfigureAwait(false)); }
public void WhenDataHasKeyAndObjectValue_ShouldAddToDataDictionary() { var honeyCombEvent = new HoneycombEvent("serviceName", new ActivityTraceId()); var list = new List <KeyValuePair <string, object> > { new KeyValuePair <string, object>("hello", 1) }; honeyCombEvent.PopulateData(list); Assert.True(honeyCombEvent.Data.ContainsKey("hello")); Assert.Equal(1, honeyCombEvent.Data["hello"]); }
private static IEnumerable <HoneycombEvent> GetActivityLinks( IEnumerable <ActivityLink> activityLinks, string displayName, ActivityTraceId traceId, ActivitySpanId spanId) { foreach (var link in activityLinks) { var linkEvent = new HoneycombEvent(displayName, traceId); linkEvent.PopulateData(link.Tags); linkEvent.Data.Add("meta.annotation_type", "link"); linkEvent.Data.Add("trace.link.span_id", link.Context.SpanId.ToString()); linkEvent.Data.Add("trace.link.trace_id", link.Context.TraceId.ToString()); yield return(linkEvent); } }
private static IEnumerable <HoneycombEvent> GetActivityEvents( IEnumerable <ActivityEvent> activityEvents, string displayName, ActivityTraceId traceId, ActivitySpanId spanId) { foreach (var evt in activityEvents) { var messageEvent = new HoneycombEvent(displayName, traceId); messageEvent.PopulateData(evt.Tags); messageEvent.Data.Add("meta.annotation_type", "span_event"); messageEvent.Data.Add("trace.parent_id", spanId.ToString()); messageEvent.Data.Add("name", evt.Name); yield return(messageEvent); } }
public async Task InvokeAsync(HttpContext context) { var stopwatch = new Stopwatch(); stopwatch.Start(); var ev = new HoneycombEvent { DataSetName = _settings.Value.DefaultDataSet }; context.Items.Add(HoneycombEventManager.ContextItemName, ev); ev.Data.Add("trace.trace_id", context.TraceIdentifier); ev.Data.Add("request.path", context.Request.Path.Value); ev.Data.Add("request.method", context.Request.Method); ev.Data.Add("request.http_version", context.Request.Protocol); ev.Data.Add("request.content_length", context.Request.ContentLength); ev.Data.Add("request.header.x_forwarded_proto", context.Request.Scheme); ev.Data.Add("meta.local_hostname", Environment.MachineName); try { await _next.Invoke(context); stopwatch.Stop(); ev.Data.TryAdd("name", $"{context.GetRouteValue("controller")}#{context.GetRouteValue("action")}"); ev.Data.TryAdd("action", context.GetRouteValue("action")); ev.Data.TryAdd("controller", context.GetRouteValue("controller")); ev.Data.TryAdd("response.content_length", context.Response.ContentLength); ev.Data.TryAdd("response.status_code", context.Response.StatusCode); ev.Data.TryAdd("duration_ms", stopwatch.ElapsedMilliseconds); } catch (Exception ex) { ev.Data.TryAdd("request.error", ex.Source); ev.Data.TryAdd("request.error_detail", ex.Message); throw; } finally { _service.QueueEvent(ev); } }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { await foreach (var activity in _channelReader.ReadAllAsync(stoppingToken)) { if (activity.Tags.Any(tag => tag.Key == "http.url" && tag.Value != null && tag.Value.StartsWith("https://api.honeycomb.io/"))) { continue; } var dataset = _dataset.Invoke(activity); if (string.IsNullOrWhiteSpace(dataset)) { throw new ApplicationException("Dataset could not be found."); } var list = new List <HoneycombEvent>(); var ev = new HoneycombEvent(activity.DisplayName, activity.TraceId); if (activity.ParentId != null) { ev.Data.Add("trace.parent_id", activity.ParentId); } ev.Data.Add("trace.span_id", activity.SpanId.ToString()); ev.Data.Add("duration_ms", activity.Duration.Milliseconds); ev.PopulateData(activity.Tags); list.Add(ev); list.AddRange(GetActivityEvents(activity.Events, activity.DisplayName, activity.TraceId, activity.SpanId)); list.AddRange(GetActivityLinks(activity.Links, activity.DisplayName, activity.TraceId, activity.SpanId)); await _honeycombService.SendBatchAsync(dataset, activity.StartTimeUtc, list).ConfigureAwait(false); } }
private void BeginRequest(object sender, EventArgs e) { var stopwatch = new Stopwatch(); stopwatch.Start(); var context = ((HttpApplication)sender).Context; context.Items.Add("honeycomb_stopwatch", stopwatch); var settings = _serviceProvider.GetRequiredService <IOptions <HoneycombApiSettings> >(); var ev = new HoneycombEvent { DataSetName = settings.Value.DefaultDataSet }; context.Items.Add(Constants.ContextItemName, ev); ev.Data.Add("trace.trace_id", Guid.NewGuid().ToString().Replace("-", "")); ev.Data.Add("request.path", context.Request.Path); ev.Data.Add("request.method", context.Request.HttpMethod); ev.Data.Add("request.http_version", context.Request.Url.Scheme); ev.Data.Add("request.content_length", context.Request.ContentLength); ev.Data.Add("meta.local_hostname", Environment.MachineName); }
public void QueueEvent(HoneycombEvent ev) { _logger.LogTrace("Queued honeycomb event"); events.Enqueue(ev); }