// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Tools.DotNETCommon
{
///
/// Interface for a trace span
///
[Obsolete("Functionality in the Tools.DotNETCommon namespace is deprecated. Please reference the EpicGames.Core namespace and assembly instead.")]
public interface ITraceSpan : IDisposable
{
///
/// Adds additional metadata to this scope
///
/// Name of the key
/// Value for this metadata
void AddMetadata(string Name, string Value);
}
///
/// Methods for creating ITraceScope instances
///
[Obsolete("Functionality in the Tools.DotNETCommon namespace is deprecated. Please reference the EpicGames.Core namespace and assembly instead.")]
public static class TraceSpan
{
///
/// Concrete implementation of ITraceScope
///
class TraceSpanImpl : ITraceSpan
{
public string Name;
public string Resource;
public string Service;
public DateTimeOffset StartTime;
public DateTimeOffset? FinishTime;
public Dictionary Metadata = new Dictionary();
public TraceSpanImpl(string Name, string Resource, string Service)
{
this.Name = Name;
this.Resource = Resource;
this.Service = Service;
this.StartTime = DateTimeOffset.Now;
}
public void AddMetadata(string Name, string Value)
{
Metadata[Name] = Value;
}
public void Dispose()
{
if(FinishTime == null)
{
FinishTime = DateTimeOffset.Now;
}
}
}
///
/// The current scope provider
///
static List Spans = new List();
///
/// Creates a scope using the current provider
///
public static ITraceSpan Create(string Name, string Resource = null, string Service = null)
{
TraceSpanImpl Span = new TraceSpanImpl(Name, Resource, Service);
Spans.Add(Span);
return Span;
}
///
/// Saves all the scope information to a file
///
public static void Flush()
{
string TelemetryDir = Environment.GetEnvironmentVariable("UE_TELEMETRY_DIR");
if (TelemetryDir != null)
{
FileReference File;
using (Process Process = Process.GetCurrentProcess())
{
DirectoryReference TelemetryDirRef = new DirectoryReference(TelemetryDir);
DirectoryReference.CreateDirectory(TelemetryDirRef);
string FileName = String.Format("{0}.{1}.json", Path.GetFileName(Assembly.GetEntryAssembly().Location), Process.Id, Process.StartTime.Ticks);
File = FileReference.Combine(TelemetryDirRef, FileName);
}
using (JsonWriter Writer = new JsonWriter(File))
{
Writer.WriteObjectStart();
Writer.WriteArrayStart("Spans");
foreach (TraceSpanImpl Span in Spans)
{
if (Span.FinishTime != null)
{
Writer.WriteObjectStart();
Writer.WriteValue("Name", Span.Name);
if (Span.Resource != null)
{
Writer.WriteValue("Resource", Span.Resource);
}
if (Span.Service != null)
{
Writer.WriteValue("Service", Span.Service);
}
Writer.WriteValue("StartTime", Span.StartTime.ToString("o", CultureInfo.InvariantCulture));
Writer.WriteValue("FinishTime", Span.FinishTime.Value.ToString("o", CultureInfo.InvariantCulture));
Writer.WriteObjectStart("Metadata");
foreach (KeyValuePair Pair in Span.Metadata)
{
Writer.WriteValue(Pair.Key, Pair.Value);
}
Writer.WriteObjectEnd();
Writer.WriteObjectEnd();
}
}
Writer.WriteArrayEnd();
Writer.WriteObjectEnd();
}
}
}
}
}