{
class CSVExporter : ICounterRenderer
{
+ private object _lock = new object(); // protects the StringBuilder instance.
private string _output;
private StringBuilder builder;
private int flushLength = 10_000; // Arbitrary length to flush
Console.WriteLine($"[Warning] {_output} already exists. This file will be overwritten.");
File.Delete(_output);
}
- builder = new StringBuilder();
- builder.AppendLine("Timestamp,Provider,Counter Name,Counter Type,Mean/Increment");
+ lock (_lock)
+ {
+ builder = new StringBuilder();
+ builder.AppendLine("Timestamp,Provider,Counter Name,Counter Type,Mean/Increment");
+ }
}
public void EventPipeSourceConnected()
public void CounterPayloadReceived(string providerName, ICounterPayload payload, bool _)
{
- if (builder.Length > flushLength)
+ lock (_lock)
{
- File.AppendAllText(_output, builder.ToString());
- builder.Clear();
- }
+ if (builder.Length > flushLength)
+ {
+ File.AppendAllText(_output, builder.ToString());
+ builder.Clear();
+ }
- builder
- .Append(DateTime.UtcNow.ToString()).Append(',')
- .Append(providerName).Append(',')
- .Append(payload.GetDisplay()).Append(',')
- .Append(payload.GetCounterType()).Append(',')
- .Append(payload.GetValue().ToString(CultureInfo.InvariantCulture)).Append('\n');
+ builder
+ .Append(DateTime.UtcNow.ToString()).Append(',')
+ .Append(providerName).Append(',')
+ .Append(payload.GetDisplay()).Append(',')
+ .Append(payload.GetCounterType()).Append(',')
+ .Append(payload.GetValue().ToString(CultureInfo.InvariantCulture)).Append('\n');
+ }
}
public void Stop()
{
+ string outputString;
// Append all the remaining text to the file.
- File.AppendAllText(_output, builder.ToString());
+ lock (_lock)
+ {
+ outputString = builder.ToString();
+ }
+ File.AppendAllText(_output, outputString);
Console.WriteLine("File saved to " + _output);
}
}
{
class JSONExporter : ICounterRenderer
{
+ private object _lock = new object();
private string _output;
private string _processName;
private StringBuilder builder;
File.Delete(_output);
}
- builder = new StringBuilder();
- builder
- .Append("{ \"TargetProcess\": \"").Append(_processName).Append("\", ")
- .Append("\"StartTime\": \"").Append(DateTime.Now.ToString()).Append("\", ")
- .Append("\"Events\": [");
+ lock (_lock)
+ {
+ builder = new StringBuilder();
+ builder
+ .Append("{ \"TargetProcess\": \"").Append(_processName).Append("\", ")
+ .Append("\"StartTime\": \"").Append(DateTime.Now.ToString()).Append("\", ")
+ .Append("\"Events\": [");
+ }
}
public void EventPipeSourceConnected()
public void CounterPayloadReceived(string providerName, ICounterPayload payload, bool _)
{
- if (builder.Length > flushLength)
+ lock (_lock)
{
- File.AppendAllText(_output, builder.ToString());
- builder.Clear();
- }
+ if (builder.Length > flushLength)
+ {
+ File.AppendAllText(_output, builder.ToString());
+ builder.Clear();
+ }
- builder
- .Append("{ \"timestamp\": \"").Append(DateTime.Now.ToString("u")).Append("\", ")
- .Append(" \"provider\": \"").Append(providerName).Append("\", ")
- .Append(" \"name\": \"").Append(payload.GetDisplay()).Append("\", ")
- .Append(" \"counterType\": \"").Append(payload.GetCounterType()).Append("\", ")
- .Append(" \"value\": ").Append(payload.GetValue().ToString(CultureInfo.InvariantCulture)).Append(" },");
+ builder
+ .Append("{ \"timestamp\": \"").Append(DateTime.Now.ToString("u")).Append("\", ")
+ .Append(" \"provider\": \"").Append(providerName).Append("\", ")
+ .Append(" \"name\": \"").Append(payload.GetDisplay()).Append("\", ")
+ .Append(" \"counterType\": \"").Append(payload.GetCounterType()).Append("\", ")
+ .Append(" \"value\": ").Append(payload.GetValue().ToString(CultureInfo.InvariantCulture)).Append(" },");
+ }
}
public void Stop()
{
- builder.Remove(builder.Length - 1, 1); // Remove the last comma to ensure valid JSON format.
- builder.Append("]}");
- // Append all the remaining text to the file.
- File.AppendAllText(_output, builder.ToString());
+ lock (_lock)
+ {
+ builder.Remove(builder.Length - 1, 1); // Remove the last comma to ensure valid JSON format.
+ builder.Append("]}");
+ // Append all the remaining text to the file.
+ File.AppendAllText(_output, builder.ToString());
+ }
Console.WriteLine("File saved to " + _output);
}
}