Ejemplo n.º 1
0
        /// <summary>
        /// Retrieves IDs and metadata for traces available for a specified time frame using an
        /// optional filter. To get the full traces, pass the trace IDs to <code>BatchGetTraces</code>.
        ///
        ///
        /// <para>
        /// A filter expression can target traced requests that hit specific service nodes or
        /// edges, have errors, or come from a known user. For example, the following filter expression
        /// targets traces that pass through <code>api.example.com</code>:
        /// </para>
        ///
        /// <para>
        ///  <code>service("api.example.com")</code>
        /// </para>
        ///
        /// <para>
        /// This filter expression finds traces that have an annotation named <code>account</code>
        /// with the value <code>12345</code>:
        /// </para>
        ///
        /// <para>
        ///  <code>annotation.account = "12345"</code>
        /// </para>
        ///
        /// <para>
        /// For a full list of indexed fields and keywords that you can use in filter expressions,
        /// see <a href="http://docs.aws.amazon.com/xray/latest/devguide/xray-console-filters.html">Using
        /// Filter Expressions</a> in the <i>AWS X-Ray Developer Guide</i>.
        /// </para>
        /// </summary>
        /// <param name="request">Container for the necessary parameters to execute the GetTraceSummaries service method.</param>
        ///
        /// <returns>The response from the GetTraceSummaries service method, as returned by XRay.</returns>
        /// <exception cref="Amazon.XRay.Model.InvalidRequestException">
        /// The request is missing required parameters or has invalid parameters.
        /// </exception>
        /// <exception cref="Amazon.XRay.Model.ThrottledException">
        /// The request exceeds the maximum number of requests per second.
        /// </exception>
        public virtual GetTraceSummariesResponse GetTraceSummaries(GetTraceSummariesRequest request)
        {
            var marshaller   = GetTraceSummariesRequestMarshaller.Instance;
            var unmarshaller = GetTraceSummariesResponseUnmarshaller.Instance;

            return(Invoke <GetTraceSummariesRequest, GetTraceSummariesResponse>(request, marshaller, unmarshaller));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Initiates the asynchronous execution of the GetTraceSummaries operation.
        /// </summary>
        ///
        /// <param name="request">Container for the necessary parameters to execute the GetTraceSummaries operation.</param>
        /// <param name="cancellationToken">
        ///     A cancellation token that can be used by other objects or threads to receive notice of cancellation.
        /// </param>
        /// <returns>The task object representing the asynchronous operation.</returns>
        public virtual Task <GetTraceSummariesResponse> GetTraceSummariesAsync(GetTraceSummariesRequest request, System.Threading.CancellationToken cancellationToken = default(CancellationToken))
        {
            var marshaller   = GetTraceSummariesRequestMarshaller.Instance;
            var unmarshaller = GetTraceSummariesResponseUnmarshaller.Instance;

            return(InvokeAsync <GetTraceSummariesRequest, GetTraceSummariesResponse>(request, marshaller,
                                                                                     unmarshaller, cancellationToken));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Initiates the asynchronous execution of the GetTraceSummaries operation.
        /// </summary>
        ///
        /// <param name="request">Container for the necessary parameters to execute the GetTraceSummaries operation on AmazonXRayClient.</param>
        /// <param name="callback">An AsyncCallback delegate that is invoked when the operation completes.</param>
        /// <param name="state">A user-defined state object that is passed to the callback procedure. Retrieve this object from within the callback
        ///          procedure using the AsyncState property.</param>
        ///
        /// <returns>An IAsyncResult that can be used to poll or wait for results, or both; this value is also needed when invoking EndGetTraceSummaries
        ///         operation.</returns>
        public virtual IAsyncResult BeginGetTraceSummaries(GetTraceSummariesRequest request, AsyncCallback callback, object state)
        {
            var marshaller   = new GetTraceSummariesRequestMarshaller();
            var unmarshaller = GetTraceSummariesResponseUnmarshaller.Instance;

            return(BeginInvoke <GetTraceSummariesRequest>(request, marshaller, unmarshaller,
                                                          callback, state));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Initiates the asynchronous execution of the GetTraceSummaries operation.
        /// </summary>
        ///
        /// <param name="request">Container for the necessary parameters to execute the GetTraceSummaries operation.</param>
        /// <param name="cancellationToken">
        ///     A cancellation token that can be used by other objects or threads to receive notice of cancellation.
        /// </param>
        /// <returns>The task object representing the asynchronous operation.</returns>
        public virtual Task <GetTraceSummariesResponse> GetTraceSummariesAsync(GetTraceSummariesRequest request, System.Threading.CancellationToken cancellationToken = default(CancellationToken))
        {
            var options = new InvokeOptions();

            options.RequestMarshaller    = GetTraceSummariesRequestMarshaller.Instance;
            options.ResponseUnmarshaller = GetTraceSummariesResponseUnmarshaller.Instance;

            return(InvokeAsync <GetTraceSummariesResponse>(request, options, cancellationToken));
        }
Ejemplo n.º 5
0
        internal virtual GetTraceSummariesResponse GetTraceSummaries(GetTraceSummariesRequest request)
        {
            var options = new InvokeOptions();

            options.RequestMarshaller    = GetTraceSummariesRequestMarshaller.Instance;
            options.ResponseUnmarshaller = GetTraceSummariesResponseUnmarshaller.Instance;

            return(Invoke <GetTraceSummariesResponse>(request, options));
        }
Ejemplo n.º 6
0
        public async Task <State> CollectMetrics(State state, ILambdaContext context)
        {
            state.EndTimeInEpoch = DateTimeOffset.UtcNow.ToUnixTimeSeconds();

            var client = new AmazonXRayClient(RegionEndpoint.APSoutheast2);
            var getTraceSummariesRequest = new GetTraceSummariesRequest
            {
                StartTime     = DateTimeOffset.FromUnixTimeSeconds(state.StartTimeInEpoch).UtcDateTime,
                EndTime       = DateTimeOffset.FromUnixTimeSeconds(state.EndTimeInEpoch).UtcDateTime,
                TimeRangeType = TimeRangeType.Event
            };

            var getTraceSummariesResponse = await client.GetTraceSummariesAsync(getTraceSummariesRequest);

            var traceIds = getTraceSummariesResponse.TraceSummaries.Select(x => x.Id);
            var traces   = new List <Trace>();

            foreach (var batchIds in Batch(traceIds, XRayBatchSize))
            {
                var request = new BatchGetTracesRequest
                {
                    TraceIds = batchIds.ToList(),
                };
                var response = await client.BatchGetTracesAsync(request);

                traces.AddRange(response.Traces);
            }

            var metrics = new List <LambdaMetric>();

            foreach (var trace in traces)
            {
                foreach (var segment in trace.Segments)
                {
                    var document = JsonConvert.DeserializeObject <XRayLambdaTrace.Document>(segment.Document);
                    Console.WriteLine(segment.Document);
                    if (document.name == state.FunctionName)
                    {
                        if (document.origin == "AWS::Lambda::Function")
                        {
                            metrics.Add(CreateLambdaMetric(document, document.trace_id, document.name, document.origin, "Total"));
                            foreach (var subSegment in document.subsegments)
                            {
                                metrics.Add(CreateLambdaMetric(subSegment, document.trace_id, document.name, document.origin, null));
                            }
                        }
                        else if (document.origin == "AWS::Lambda")
                        {
                            metrics.Add(CreateLambdaMetric(document, document.trace_id, document.name, document.origin, "Total"));
                        }
                    }
                }
            }

            var contentBody = string.Empty;

            using (var writer = new StringWriter())
                using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture, true))
                {
                    csv.WriteRecords(metrics);
                    csv.Flush();
                    contentBody = writer.ToString();
                }

            var bucketName       = System.Environment.GetEnvironmentVariable("MetricS3BucketName");
            var now              = DateTime.Now;
            var putObjectRequest = new PutObjectRequest
            {
                BucketName  = bucketName,
                Key         = $"{now:yyyy-MM-dd}/{state.FunctionName}-{now:HHmmss}.csv",
                ContentType = "text/csv",
                ContentBody = contentBody
            };

            var s3Client = new AmazonS3Client(RegionEndpoint.APSoutheast2);
            await s3Client.PutObjectAsync(putObjectRequest);

            return(state);
        }