Skip to content

Commit 6e9b054

Browse files
Unity-Billal-mesloubTimothy Mothra Lee
andauthored
resporce provider for statsbeat (#175)
Co-authored-by: Timothy Mothra Lee <[email protected]>
1 parent 947a8d2 commit 6e9b054

File tree

5 files changed

+223
-0
lines changed

5 files changed

+223
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using System.Net.Http;
6+
using System.Text.Json;
7+
8+
namespace Azure.Monitor.OpenTelemetry.Exporter.Internals.Statsbeat
9+
{
10+
internal class DefaultVmMetadataProvider : IVmMetadataProvider
11+
{
12+
public VmMetadataResponse? GetVmMetadataResponse()
13+
{
14+
try
15+
{
16+
using (var httpClient = new HttpClient())
17+
{
18+
httpClient.DefaultRequestHeaders.Add("Metadata", "True");
19+
var responseString = httpClient.GetStringAsync(StatsbeatConstants.AMS_Url);
20+
var vmMetadata = JsonSerializer.Deserialize<VmMetadataResponse>(responseString.Result);
21+
22+
return vmMetadata;
23+
}
24+
}
25+
catch (Exception ex)
26+
{
27+
AzureMonitorExporterEventSource.Log.WriteInformational("Failed to get VM metadata details", ex);
28+
return null;
29+
}
30+
}
31+
}
32+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
namespace Azure.Monitor.OpenTelemetry.Exporter.Internals.Statsbeat
5+
{
6+
internal interface IVmMetadataProvider
7+
{
8+
public VmMetadataResponse? GetVmMetadataResponse();
9+
}
10+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using System.Globalization;
6+
using Azure.Monitor.OpenTelemetry.Exporter.Internals.Platform;
7+
8+
namespace Azure.Monitor.OpenTelemetry.Exporter.Internals.Statsbeat
9+
{
10+
internal static class ResourceProvider
11+
{
12+
internal static ResourceProviderDetails GetResourceProviderDetails(IPlatform platform, IVmMetadataProvider vmMetadataProvider)
13+
{
14+
try
15+
{
16+
var appSvcWebsiteName = platform.GetEnvironmentVariable("WEBSITE_SITE_NAME");
17+
if (appSvcWebsiteName != null)
18+
{
19+
var appSvcWebsiteHostName = platform.GetEnvironmentVariable("WEBSITE_HOME_STAMPNAME");
20+
21+
return new ResourceProviderDetails
22+
{
23+
ResourceProvider = "appsvc",
24+
ResourceProviderId = string.IsNullOrEmpty(appSvcWebsiteHostName)
25+
? appSvcWebsiteName
26+
: appSvcWebsiteName + "/" + appSvcWebsiteHostName,
27+
OperatingSystem = platform.GetOSPlatformName(),
28+
};
29+
}
30+
31+
var functionsWorkerRuntime = platform.GetEnvironmentVariable("FUNCTIONS_WORKER_RUNTIME");
32+
if (functionsWorkerRuntime != null)
33+
{
34+
return new ResourceProviderDetails
35+
{
36+
ResourceProvider = "functions",
37+
ResourceProviderId = platform.GetEnvironmentVariable("WEBSITE_HOSTNAME"),
38+
OperatingSystem = platform.GetOSPlatformName(),
39+
};
40+
}
41+
42+
var vmMetadata = vmMetadataProvider.GetVmMetadataResponse();
43+
if (vmMetadata != null)
44+
{
45+
return new ResourceProviderDetails
46+
{
47+
ResourceProvider = "vm",
48+
ResourceProviderId = vmMetadata.vmId + "/" + vmMetadata.subscriptionId,
49+
OperatingSystem = vmMetadata.osType?.ToLower(CultureInfo.InvariantCulture)
50+
?? platform.GetOSPlatformName(),
51+
};
52+
}
53+
}
54+
catch (Exception ex)
55+
{
56+
AzureMonitorExporterEventSource.Log.WriteWarning("ErrorGettingResourceProviderData", ex);
57+
}
58+
59+
return new ResourceProviderDetails
60+
{
61+
ResourceProvider = "unknown",
62+
ResourceProviderId = "unknown",
63+
OperatingSystem = platform.GetOSPlatformName(),
64+
};
65+
}
66+
67+
internal class ResourceProviderDetails
68+
{
69+
public string? ResourceProvider;
70+
71+
public string? ResourceProviderId;
72+
73+
public string? OperatingSystem;
74+
}
75+
}
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using Azure.Monitor.OpenTelemetry.Exporter.Internals.Statsbeat;
5+
6+
namespace Azure.Monitor.OpenTelemetry.Exporter.Tests.CommonTestFramework
7+
{
8+
internal class MockVmMetadataProvider : IVmMetadataProvider
9+
{
10+
public VmMetadataResponse? Response { get; set; } = null;
11+
12+
public VmMetadataResponse? GetVmMetadataResponse() => Response;
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using Azure.Monitor.OpenTelemetry.Exporter.Internals.Statsbeat;
5+
using Azure.Monitor.OpenTelemetry.Exporter.Tests.CommonTestFramework;
6+
using Xunit;
7+
8+
namespace Azure.Monitor.OpenTelemetry.Exporter.Tests
9+
{
10+
public class ResourceProviderTests
11+
{
12+
[Fact]
13+
public void Verify_GetResourceProviderDetails_Default()
14+
{
15+
var platform = new MockPlatform();
16+
platform.OSPlatformName = "UnitTest";
17+
18+
var resourceProviderDetails = ResourceProvider.GetResourceProviderDetails(platform, new MockVmMetadataProvider());
19+
20+
Assert.Equal("unknown", resourceProviderDetails.ResourceProvider);
21+
Assert.Equal("unknown", resourceProviderDetails.ResourceProviderId);
22+
Assert.Equal("UnitTest", resourceProviderDetails.OperatingSystem);
23+
}
24+
25+
[Fact]
26+
public void Verify_GetResourceProviderDetails_AppService1()
27+
{
28+
var platform = new MockPlatform();
29+
platform.OSPlatformName = "UnitTest";
30+
platform.SetEnvironmentVariable("WEBSITE_SITE_NAME", "testWebSite");
31+
32+
var resourceProviderDetails = ResourceProvider.GetResourceProviderDetails(platform, new MockVmMetadataProvider());
33+
34+
Assert.Equal("appsvc", resourceProviderDetails.ResourceProvider);
35+
Assert.Equal("testWebSite", resourceProviderDetails.ResourceProviderId);
36+
Assert.Equal("UnitTest", resourceProviderDetails.OperatingSystem);
37+
}
38+
39+
[Fact]
40+
public void Verify_GetResourceProviderDetails_AppService2()
41+
{
42+
var platform = new MockPlatform();
43+
platform.OSPlatformName = "UnitTest";
44+
platform.SetEnvironmentVariable("WEBSITE_SITE_NAME", "testWebSite");
45+
platform.SetEnvironmentVariable("WEBSITE_HOME_STAMPNAME", "testStampName");
46+
47+
var resourceProviderDetails = ResourceProvider.GetResourceProviderDetails(platform, new MockVmMetadataProvider());
48+
49+
Assert.Equal("appsvc", resourceProviderDetails.ResourceProvider);
50+
Assert.Equal("testWebSite/testStampName", resourceProviderDetails.ResourceProviderId);
51+
Assert.Equal("UnitTest", resourceProviderDetails.OperatingSystem);
52+
}
53+
54+
[Fact]
55+
public void Verify_GetResourceProviderDetails_Functions()
56+
{
57+
var platform = new MockPlatform();
58+
platform.OSPlatformName = "UnitTest";
59+
platform.SetEnvironmentVariable("FUNCTIONS_WORKER_RUNTIME", "test");
60+
platform.SetEnvironmentVariable("WEBSITE_HOSTNAME", "testHostName");
61+
62+
var resourceProviderDetails = ResourceProvider.GetResourceProviderDetails(platform, new MockVmMetadataProvider());
63+
64+
Assert.Equal("functions", resourceProviderDetails.ResourceProvider);
65+
Assert.Equal("testHostName", resourceProviderDetails.ResourceProviderId);
66+
Assert.Equal("UnitTest", resourceProviderDetails.OperatingSystem);
67+
}
68+
69+
[Fact]
70+
public void Verify_GetResourceProviderDetails_AzureVM()
71+
{
72+
var platform = new MockPlatform();
73+
74+
var vmMetadataProvider = new MockVmMetadataProvider
75+
{
76+
Response = new VmMetadataResponse
77+
{
78+
osType = "UnitTest",
79+
vmId = "testVmId",
80+
subscriptionId = "testSubscriptionId",
81+
}
82+
};
83+
84+
var resourceProviderDetails = ResourceProvider.GetResourceProviderDetails(platform, vmMetadataProvider);
85+
86+
Assert.Equal("vm", resourceProviderDetails.ResourceProvider);
87+
Assert.Equal("testVmId/testSubscriptionId", resourceProviderDetails.ResourceProviderId);
88+
Assert.Equal("unittest", resourceProviderDetails.OperatingSystem);
89+
}
90+
}
91+
}

0 commit comments

Comments
 (0)