public string m_Name;
public double m_Value;
public string m_DisplayName;
+ public string m_DisplayUnits;
+
public CounterPayload(IDictionary<string, object> payloadFields)
{
m_Name = payloadFields["Name"].ToString();
m_Value = (double)payloadFields["Mean"];
m_DisplayName = payloadFields["DisplayName"].ToString();
+ m_DisplayUnits = payloadFields["DisplayUnits"].ToString();
+
+ // In case these properties are not provided, set them to appropriate values.
+ m_DisplayName = m_DisplayName.Length == 0 ? m_Name : m_DisplayName;
}
public string GetName()
public string GetDisplay()
{
- return m_DisplayName;
+ if (m_DisplayUnits.Length > 0)
+ {
+ return $"{m_DisplayName} ({m_DisplayUnits})";
+ }
+ return $"{m_DisplayName}";
}
public string GetCounterType()
public double m_Value;
public string m_DisplayName;
public string m_DisplayRateTimeScale;
+ public string m_DisplayUnits;
public IncrementingCounterPayload(IDictionary<string, object> payloadFields, int interval)
{
m_Value = (double)payloadFields["Increment"];
m_DisplayName = payloadFields["DisplayName"].ToString();
m_DisplayRateTimeScale = payloadFields["DisplayRateTimeScale"].ToString();
+ m_DisplayUnits = payloadFields["DisplayUnits"].ToString();
timescaleInSec = m_DisplayRateTimeScale.Length == 0 ? 1 : (int)TimeSpan.Parse(m_DisplayRateTimeScale).TotalSeconds;
m_Value *= timescaleInSec;
public string GetDisplay()
{
+ if (m_DisplayUnits.Length > 0)
+ return $"{m_DisplayName} / {m_DisplayRateTimeScale} ({m_DisplayUnits})";
+
return $"{m_DisplayName} / {m_DisplayRateTimeScale}";
}
}
}
+ [Fact]
+ public void DisplayUnitsTest()
+ {
+ string fileName = "displayUnitsTest.csv";
+ CSVExporter exporter = new CSVExporter(fileName);
+ exporter.Initialize();
+ for (int i = 0; i < 100; i++)
+ {
+ exporter.CounterPayloadReceived("myProvider", TestHelpers.GenerateCounterPayload(true, "allocRateGen", i, 60, "Allocation Rate Gen: " + i.ToString(), "MB"), false);
+ }
+ exporter.Stop();
+
+ Assert.True(File.Exists(fileName));
+
+ try
+ {
+ List<string> lines = File.ReadLines(fileName).ToList();
+ Assert.Equal(101, lines.Count); // should be 101 including the headers
+
+ string[] headerTokens = lines[0].Split(',');
+ Assert.Equal("Provider", headerTokens[1]);
+ Assert.Equal("Counter Name", headerTokens[2]);
+ Assert.Equal("Counter Type", headerTokens[3]);
+ Assert.Equal("Mean/Increment", headerTokens[4]);
+
+ for (int i = 1; i < lines.Count; i++)
+ {
+ string[] tokens = lines[i].Split(',');
+
+ Assert.Equal("myProvider", tokens[1]);
+ Assert.Equal($"Allocation Rate Gen: {i-1} / 60 sec (MB)", tokens[2]);
+ Assert.Equal("Rate", tokens[3]);
+ Assert.Equal(((i - 1) * 60).ToString(), tokens[4]);
+ }
+ }
+ finally
+ {
+ File.Delete(fileName);
+ }
+ }
}
}
}
}
}
+
+ [Fact]
+ public void DisplayUnitsTest()
+ {
+ string fileName = "displayUnitsTest.json";
+ JSONExporter exporter = new JSONExporter(fileName, "myProcess.exe");
+ exporter.Initialize();
+
+ for (int i = 0 ; i < 20; i++)
+ {
+ exporter.CounterPayloadReceived("myProvider", TestHelpers.GenerateCounterPayload(false, "heapSize", (double)i, 0, "Heap Size", "MB"), false);
+ }
+ exporter.Stop();
+
+ Assert.True(File.Exists(fileName));
+ using (StreamReader r = new StreamReader(fileName))
+ {
+ string json = r.ReadToEnd();
+ JSONCounterTrace counterTrace = JsonConvert.DeserializeObject<JSONCounterTrace>(json);
+ Assert.Equal("myProcess.exe", counterTrace.targetProcess);
+ Assert.Equal(20, counterTrace.events.Length);
+ var i = 0;
+ foreach(JSONCounterPayload payload in counterTrace.events)
+ {
+ Assert.Equal("myProvider", payload.provider);
+ Assert.Equal("Heap Size (MB)", payload.name);
+ Assert.Equal(i, payload.value);
+ i += 1;
+ }
+ }
+ }
}
class JSONCounterPayload
string counterName,
double counterValue,
int displayRateTimeScaleSeconds = 0,
- string displayName = "")
+ string displayName = "",
+ string displayUnits = "")
{
if (isIncrementingCounter)
{
{ "Increment", counterValue },
{ "DisplayName", displayName },
{ "DisplayRateTimeScale", displayRateTimeScaleSeconds == 0 ? "" : TimeSpan.FromSeconds(displayRateTimeScaleSeconds).ToString() },
+ { "DisplayUnits", displayUnits },
};
ICounterPayload payload = new IncrementingCounterPayload(payloadFields, 1);
return payload;
{ "Name", counterName },
{ "Mean", counterValue },
{ "DisplayName", displayName },
+ { "DisplayUnits", displayUnits },
};
ICounterPayload payload = new CounterPayload(payloadFields);
return payload;