Skip to content

Commit 72510aa

Browse files
authored
Add LogTable and LogTableRow to MonitorQueryModelFactory (Azure#25592)
1 parent 5dcc7ec commit 72510aa

File tree

9 files changed

+165
-29
lines changed

9 files changed

+165
-29
lines changed

sdk/monitor/Azure.Monitor.Query/CHANGELOG.md

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
# Release History
22

3-
## 1.1.0-beta.1 (Unreleased)
4-
3+
## 1.1.0 (2021-12-07)
54
### Features Added
5+
- Added `LogsTable` and `LogsTableRow` to `MonitorQueryModelFactory`
66

7-
### Breaking Changes
8-
9-
### Bugs Fixed
10-
11-
### Other Changes
127

138
## 1.0.1 (2021-11-09)
149

sdk/monitor/Azure.Monitor.Query/api/Azure.Monitor.Query.netstandard2.0.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,9 @@ internal MetricValue() { }
343343
public static partial class MonitorQueryModelFactory
344344
{
345345
public static Azure.Monitor.Query.Models.LogsQueryResult LogsQueryResult(System.Collections.Generic.IReadOnlyList<Azure.Monitor.Query.Models.LogsTable> allTables, System.BinaryData statistics, System.BinaryData visualization, System.BinaryData error) { throw null; }
346+
public static Azure.Monitor.Query.Models.LogsTable LogsTable(string name, System.Collections.Generic.IEnumerable<Azure.Monitor.Query.Models.LogsTableColumn> columns, System.Collections.Generic.IEnumerable<Azure.Monitor.Query.Models.LogsTableRow> rows) { throw null; }
346347
public static Azure.Monitor.Query.Models.LogsTableColumn LogsTableColumn(string name = null, Azure.Monitor.Query.Models.LogsColumnType type = default(Azure.Monitor.Query.Models.LogsColumnType)) { throw null; }
348+
public static Azure.Monitor.Query.Models.LogsTableRow LogsTableRow(System.Collections.Generic.IEnumerable<Azure.Monitor.Query.Models.LogsTableColumn> columns, System.Collections.Generic.IEnumerable<object> values) { throw null; }
347349
public static Azure.Monitor.Query.Models.MetricAvailability MetricAvailability(System.TimeSpan? granularity = default(System.TimeSpan?), System.TimeSpan? retention = default(System.TimeSpan?)) { throw null; }
348350
public static Azure.Monitor.Query.Models.MetricsQueryResult MetricsQueryResult(int? cost, string timespan, System.TimeSpan? granularity, string @namespace, string resourceRegion, System.Collections.Generic.IReadOnlyList<Azure.Monitor.Query.Models.MetricResult> metrics) { throw null; }
349351
public static Azure.Monitor.Query.Models.MetricValue MetricValue(System.DateTimeOffset timeStamp = default(System.DateTimeOffset), double? average = default(double?), double? minimum = default(double?), double? maximum = default(double?), double? total = default(double?), double? count = default(double?)) { throw null; }

sdk/monitor/Azure.Monitor.Query/src/Azure.Monitor.Query.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<Description>A library for querying Azure Monitor's Logs and Metrics data sources.</Description>
44
<AssemblyTitle>Azure Monitor Query client library</AssemblyTitle>
5-
<Version>1.1.0-beta.1</Version>
5+
<Version>1.1.0</Version>
66
<!--The ApiCompatVersion is managed automatically and should not generally be modified manually.-->
77
<ApiCompatVersion>1.0.1</ApiCompatVersion>
88
<PackageTags>Azure Monitor Query</PackageTags>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using Azure.Core;
7+
8+
namespace Azure.Monitor.Query.Models
9+
{
10+
[CodeGenModel("Column")]
11+
public partial class LogsTableColumn
12+
{
13+
/// <inheritdoc />
14+
public override string ToString()
15+
{
16+
return $"{Name} ({Type})";
17+
}
18+
19+
internal static Dictionary<string, int> GetColumnMapFromColumns(IEnumerable<LogsTableColumn> columns)
20+
{
21+
Dictionary<string, int> columnMap = new();
22+
var columnsList = columns.ToArray();
23+
for (var index = 0; index < columnsList.Length; index++)
24+
{
25+
columnMap[columnsList[index].Name] = index;
26+
}
27+
return columnMap;
28+
}
29+
}
30+
}

sdk/monitor/Azure.Monitor.Query/src/Models/LogsTableRow.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class LogsTableRow: IReadOnlyList<object>
1818
{
1919
private readonly Dictionary<string, int> _columnMap;
2020
private readonly IReadOnlyList<LogsTableColumn> _columns;
21-
private readonly JsonElement _row;
21+
internal JsonElement _row;
2222

2323
internal LogsTableRow(Dictionary<string, int> columnMap, IReadOnlyList<LogsTableColumn> columns, JsonElement row)
2424
{

sdk/monitor/Azure.Monitor.Query/src/Models/MonitorQueryModelFactory.cs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.IO;
7+
using System.Linq;
8+
using System.Text;
69
using System.Text.Json;
10+
using Azure.Monitor.Query.Models;
711

812
namespace Azure.Monitor.Query.Models
913
{
@@ -12,7 +16,7 @@ namespace Azure.Monitor.Query.Models
1216
/// </summary>
1317
public static partial class MonitorQueryModelFactory
1418
{
15-
/// <summary> Initializes a new instance of MetricsQueryResult. </summary>
19+
/// <summary> Enables the user to create an instance of a <see cref="MetricsQueryResult"/>. </summary>
1620
/// <param name="cost"> The integer value representing the relative cost of the query. </param>
1721
/// <param name="timespan"> The timespan for which the data was retrieved. Its value consists of two datetimes concatenated, separated by &apos;/&apos;. This may be adjusted in the future and returned back from what was originally requested. </param>
1822
/// <param name="granularity"> The interval (window size) for which the metric data was returned in. This may be adjusted in the future and returned back from what was originally requested. This is not present if a metadata request was made. </param>
@@ -24,7 +28,7 @@ public static MetricsQueryResult MetricsQueryResult(int? cost, string timespan,
2428
return new MetricsQueryResult(cost, timespan, granularity, @namespace, resourceRegion, metrics);
2529
}
2630

27-
/// <summary> Initializes a new instance of LogsQueryResult. </summary>
31+
/// <summary> Enables the user to create an instance of a <see cref="LogsQueryResult"/>. </summary>
2832
/// <param name="allTables"> The list of tables, columns and rows. </param>
2933
/// <param name="statistics"> Any object. </param>
3034
/// <param name="visualization"> Any object. </param>
@@ -36,5 +40,45 @@ public static LogsQueryResult LogsQueryResult(IReadOnlyList<LogsTable> allTables
3640
JsonElement errorJson = error.ToObjectFromJson<JsonElement>();
3741
return new LogsQueryResult(allTables, statisticsJson, visualizationJson, errorJson);
3842
}
43+
44+
/// <summary> Enables the user to create an instance of a <see cref="LogsTableRow"/>. </summary>
45+
/// <param name="columns"> The list of columns. </param>
46+
/// <param name="values"> An object array representing the rows of the table. </param>
47+
/// <returns> A new <see cref="Models.LogsTableRow"/> instance for mocking. </returns>
48+
public static LogsTableRow LogsTableRow(IEnumerable<LogsTableColumn> columns, IEnumerable<object> values)
49+
{
50+
var columnsList = columns.ToArray();
51+
var columnMap = Models.LogsTableColumn.GetColumnMapFromColumns(columns);
52+
JsonElement row = JsonElementFromObject(values);
53+
return new LogsTableRow(columnMap, columnsList, row);
54+
}
55+
56+
/// <summary> Enables the user to create an instance of a <see cref="LogsTable"/>. </summary>
57+
/// <param name="name"> The name of the table. </param>
58+
/// <param name="columns"> The list of columns. </param>
59+
/// <param name="rows"> The list of rows. </param>
60+
/// <exception cref="ArgumentNullException"> <paramref name="name"/> or <paramref name="rows"/> is <c>null</c>. </exception>
61+
public static LogsTable LogsTable(string name, IEnumerable<LogsTableColumn> columns, IEnumerable<LogsTableRow> rows)
62+
{
63+
using MemoryStream stream = new MemoryStream();
64+
using Utf8JsonWriter writer = new Utf8JsonWriter(stream);
65+
writer.WriteStartArray();
66+
foreach (var row in rows)
67+
{
68+
row._row.WriteTo(writer);
69+
}
70+
writer.WriteEndArray();
71+
writer.Flush();
72+
var doc = JsonDocument.Parse(stream.ToArray());
73+
var logsTableRow = doc.RootElement.Clone();
74+
return new LogsTable(name, columns, logsTableRow);
75+
}
76+
77+
private static JsonElement JsonElementFromObject<TValue>(TValue value, JsonSerializerOptions options = default)
78+
{
79+
var bytes = JsonSerializer.SerializeToUtf8Bytes(value, options);
80+
var doc = JsonDocument.Parse(bytes);
81+
return doc.RootElement.Clone();
82+
}
3983
}
4084
}

sdk/monitor/Azure.Monitor.Query/src/Models/QueryResultColumn.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.

sdk/monitor/Azure.Monitor.Query/tests/LogsQueryClientClientLiveTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -754,7 +754,7 @@ private record TestModelForTypesNullable
754754
public BinaryData Dynamic { get; set; }
755755
}
756756

757-
[Test]
757+
[RecordedTest]
758758
public async Task ValidateNanAndInfResultsDoubleAsync()
759759
{
760760
var client = CreateClient();

sdk/monitor/Azure.Monitor.Query/tests/LogsQueryClientTests.cs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Linq;
67
using System.Threading;
78
using System.Threading.Tasks;
89
using Azure.Core;
@@ -192,5 +193,86 @@ public void MonitorQueryModelFactory_LogsQueryResult_ConvertBinaryDataToJsonElem
192193
Assert.AreEqual("PartialError", result.Error.Code);
193194
Assert.AreEqual("There were some errors when processing your query.", result.Error.Message);
194195
}
196+
197+
[Test]
198+
public void ValidateMonitorModelFactoryTableCreation()
199+
{
200+
LogsTableColumn logsTableColumn0 = MonitorQueryModelFactory.LogsTableColumn("column0", LogsColumnType.Datetime);
201+
LogsTableColumn logsTableColumn1 = MonitorQueryModelFactory.LogsTableColumn("column1", LogsColumnType.Guid);
202+
LogsTableColumn logsTableColumn2 = MonitorQueryModelFactory.LogsTableColumn("column2", LogsColumnType.Int);
203+
LogsTableColumn logsTableColumn3 = MonitorQueryModelFactory.LogsTableColumn("column3", LogsColumnType.Long);
204+
LogsTableColumn logsTableColumn4 = MonitorQueryModelFactory.LogsTableColumn("column4", LogsColumnType.Real);
205+
LogsTableColumn logsTableColumn5 = MonitorQueryModelFactory.LogsTableColumn("column5", LogsColumnType.String);
206+
LogsTableColumn logsTableColumn6 = MonitorQueryModelFactory.LogsTableColumn("column6", LogsColumnType.Timespan);
207+
LogsTableColumn logsTableColumn7 = MonitorQueryModelFactory.LogsTableColumn("column7", LogsColumnType.Decimal);
208+
LogsTableColumn logsTableColumn8 = MonitorQueryModelFactory.LogsTableColumn("column8", LogsColumnType.Bool);
209+
LogsTableColumn logsTableColumn9 = MonitorQueryModelFactory.LogsTableColumn("column9", LogsColumnType.Dynamic);
210+
LogsTableColumn[] logsTableColumns = new LogsTableColumn[] { logsTableColumn0, logsTableColumn1, logsTableColumn2, logsTableColumn3, logsTableColumn4, logsTableColumn5, logsTableColumn6, logsTableColumn7, logsTableColumn8, logsTableColumn9};
211+
Object[] rowValues = new Object[] { "2015-12-31T23:59:59.9Z", "74be27de-1e4e-49d9-b579-fe0b331d3642", 12345, 1234567890123, 12345.6789, "string value", "00:00:10", "0.10101", false, "{\u0022a\u0022:123,\u0022b\u0022:\u0022hello\u0022,\u0022c\u0022:[1,2,3],\u0022d\u0022:{}}" };
212+
213+
LogsTableRow logsTableRow = MonitorQueryModelFactory.LogsTableRow(logsTableColumns, rowValues);
214+
LogsTableRow[] rowArray = new LogsTableRow[] { logsTableRow };
215+
LogsTable logsTable = MonitorQueryModelFactory.LogsTable("tester", logsTableColumns.AsEnumerable(), rowArray.AsEnumerable());
216+
217+
Assert.AreEqual("tester", logsTable.Name);
218+
Assert.AreEqual(1, logsTable.Rows.Count);
219+
Assert.AreEqual(10, logsTable.Columns.Count);
220+
221+
Assert.AreEqual("column0", logsTable.Columns[0].Name);
222+
Assert.AreEqual("datetime", logsTable.Columns[0].Type.ToString());
223+
Assert.AreEqual("column1", logsTable.Columns[1].Name);
224+
Assert.AreEqual("guid", logsTable.Columns[1].Type.ToString());
225+
Assert.AreEqual("column2", logsTable.Columns[2].Name);
226+
Assert.AreEqual("int", logsTable.Columns[2].Type.ToString());
227+
Assert.AreEqual("column3", logsTable.Columns[3].Name);
228+
Assert.AreEqual("long", logsTable.Columns[3].Type.ToString());
229+
Assert.AreEqual("column4", logsTable.Columns[4].Name);
230+
Assert.AreEqual("real", logsTable.Columns[4].Type.ToString());
231+
Assert.AreEqual("column5", logsTable.Columns[5].Name);
232+
Assert.AreEqual("string", logsTable.Columns[5].Type.ToString());
233+
Assert.AreEqual("column6", logsTable.Columns[6].Name);
234+
Assert.AreEqual("timespan", logsTable.Columns[6].Type.ToString());
235+
Assert.AreEqual("column7", logsTable.Columns[7].Name);
236+
Assert.AreEqual("decimal", logsTable.Columns[7].Type.ToString());
237+
Assert.AreEqual("column8", logsTable.Columns[8].Name);
238+
Assert.AreEqual("bool", logsTable.Columns[8].Type.ToString());
239+
Assert.AreEqual("column9", logsTable.Columns[9].Name);
240+
Assert.AreEqual("dynamic", logsTable.Columns[9].Type.ToString());
241+
242+
var expectedDate = DateTimeOffset.Parse("2015-12-31 23:59:59.9+00:00");
243+
244+
Assert.AreEqual(expectedDate, logsTable.Rows[0].GetDateTimeOffset(0));
245+
Assert.AreEqual(expectedDate, logsTable.Rows[0].GetObject("column0"));
246+
Assert.AreEqual(false, logsTable.Rows[0].GetBoolean("column8"));
247+
Assert.AreEqual(false, logsTable.Rows[0].GetBoolean(8));
248+
Assert.AreEqual(false, logsTable.Rows[0].GetObject("column8"));
249+
Assert.AreEqual(Guid.Parse("74be27de-1e4e-49d9-b579-fe0b331d3642"), logsTable.Rows[0].GetGuid("column1"));
250+
Assert.AreEqual(Guid.Parse("74be27de-1e4e-49d9-b579-fe0b331d3642"), logsTable.Rows[0].GetGuid(1));
251+
Assert.AreEqual(Guid.Parse("74be27de-1e4e-49d9-b579-fe0b331d3642"), logsTable.Rows[0].GetObject("column1"));
252+
Assert.AreEqual(12345, logsTable.Rows[0].GetInt32("column2"));
253+
Assert.AreEqual(12345, logsTable.Rows[0].GetInt32(2));
254+
Assert.AreEqual(12345, logsTable.Rows[0].GetObject("column2"));
255+
Assert.AreEqual(1234567890123, logsTable.Rows[0].GetInt64("column3"));
256+
Assert.AreEqual(1234567890123, logsTable.Rows[0].GetInt64(3));
257+
Assert.AreEqual(1234567890123, logsTable.Rows[0].GetObject("column3"));
258+
Assert.AreEqual(12345.6789d, logsTable.Rows[0].GetDouble("column4"));
259+
Assert.AreEqual(12345.6789d, logsTable.Rows[0].GetDouble(4));
260+
Assert.AreEqual(12345.6789d, logsTable.Rows[0].GetObject("column4"));
261+
Assert.AreEqual("string value", logsTable.Rows[0].GetString("column5"));
262+
Assert.AreEqual("string value", logsTable.Rows[0].GetString(5));
263+
Assert.AreEqual("string value", logsTable.Rows[0].GetObject("column5"));
264+
Assert.AreEqual(TimeSpan.FromSeconds(10), logsTable.Rows[0].GetTimeSpan("column6"));
265+
Assert.AreEqual(TimeSpan.FromSeconds(10), logsTable.Rows[0].GetTimeSpan(6));
266+
Assert.AreEqual(TimeSpan.FromSeconds(10), logsTable.Rows[0].GetObject("column6"));
267+
Assert.AreEqual(0.10101m, logsTable.Rows[0].GetDecimal("column7"));
268+
Assert.AreEqual(0.10101m, logsTable.Rows[0].GetDecimal(7));
269+
Assert.AreEqual(0.10101m, logsTable.Rows[0].GetObject("column7"));
270+
Assert.IsFalse(logsTable.Rows[0].GetBoolean("column8"));
271+
Assert.IsFalse(logsTable.Rows[0].GetBoolean(8));
272+
Assert.AreEqual(false, logsTable.Rows[0].GetObject("column8"));
273+
Assert.AreEqual("{\"a\":123,\"b\":\"hello\",\"c\":[1,2,3],\"d\":{}}", logsTable.Rows[0].GetDynamic(9).ToString());
274+
Assert.AreEqual("{\"a\":123,\"b\":\"hello\",\"c\":[1,2,3],\"d\":{}}", logsTable.Rows[0].GetDynamic("column9").ToString());
275+
Assert.AreEqual("{\"a\":123,\"b\":\"hello\",\"c\":[1,2,3],\"d\":{}}", logsTable.Rows[0].GetObject("column9").ToString());
276+
}
195277
}
196278
}

0 commit comments

Comments
 (0)