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));
 }
Beispiel #4
0
            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);
 }