Skip to content
This repository was archived by the owner on Feb 23, 2024. It is now read-only.

Commit 22c27fb

Browse files
fortunkamMatthew Fortunka
andauthored
Added support for Service diagnostics (All API level) (#519)
* changed property resourcetype from Microsoft.ApiManagement/service/properties to Microsoft.ApiManagement/service/namedValues inline with latest API version * fixed generation of ProductAPI template * Added extractor for All API service/diagnostics Co-authored-by: Matthew Fortunka <mafortun@microsoft.com>
1 parent e1f19f0 commit 22c27fb

File tree

6 files changed

+85
-3
lines changed

6 files changed

+85
-3
lines changed

src/APIM_ARMTemplate/apimtemplate/Common/Constants/ResourceTypeConstants.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ internal static class ResourceTypeConstants
66
public const string API = "Microsoft.ApiManagement/service/apis";
77
public const string APIVersionSet = "Microsoft.ApiManagement/service/apiVersionSets";
88
public const string APIDiagnostic = "Microsoft.ApiManagement/service/apis/diagnostics";
9+
public const string APIServiceDiagnostic = "Microsoft.ApiManagement/service/diagnostics";
910
public const string APIOperation = "Microsoft.ApiManagement/service/apis/operations";
1011
public const string APIOperationPolicy = "Microsoft.ApiManagement/service/apis/operations/policies";
1112
public const string APIOperationTag = "Microsoft.ApiManagement/service/apis/operations/tags";
@@ -22,7 +23,7 @@ internal static class ResourceTypeConstants
2223
public const string ProductGroup = "Microsoft.ApiManagement/service/products/groups";
2324
public const string ProductTag = "Microsoft.ApiManagement/service/products/tags";
2425
public const string ProductPolicy = "Microsoft.ApiManagement/service/products/policies";
25-
public const string Property = "Microsoft.ApiManagement/service/properties";
26+
public const string Property = "Microsoft.ApiManagement/service/namedValues";
2627
public const string Subscription = "Microsoft.ApiManagement/service/subscriptions";
2728
public const string Tag = "Microsoft.ApiManagement/service/tags";
2829
}

src/APIM_ARMTemplate/apimtemplate/Common/TemplateModels/DiagnosticTemplateResource.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ public class DiagnosticTemplateProperties
1111
{
1212
public string alwaysLog { get; set; }
1313
public string loggerId { get; set; }
14+
public string httpCorrelationProtocol { get; set; }
15+
public string verbosity { get; set; }
16+
public Nullable<bool> logClientIp { get; set; }
17+
1418
public DiagnosticTemplateSampling sampling { get; set; }
1519
public DiagnosticTemplateFrontendBackend frontend { get; set; }
1620
public DiagnosticTemplateFrontendBackend backend { get; set; }

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/APIExtractor.cs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,16 @@ public async Task<string> GetAPISchemaDetailsAsync(string ApiManagementName, str
214214
return await CallApiManagementAsync(azToken, requestUrl);
215215
}
216216

217+
public async Task<string> GetServiceDiagnosticsAsync(string ApiManagementName, string ResourceGroupName)
218+
{
219+
(string azToken, string azSubId) = await auth.GetAccessToken();
220+
221+
string requestUrl = string.Format("{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/diagnostics?api-version={4}",
222+
baseUrl, azSubId, ResourceGroupName, ApiManagementName, GlobalConstants.APIVersion);
223+
224+
return await CallApiManagementAsync(azToken, requestUrl);
225+
}
226+
217227
public async Task<List<TemplateResource>> GenerateSingleAPIResourceAsync(string apiName, Extractor exc)
218228
{
219229
List<TemplateResource> templateResources = new List<TemplateResource>();
@@ -388,6 +398,12 @@ public async Task<Template> GenerateAPIsARMTemplateAsync(string singleApiName, L
388398
}
389399
}
390400

401+
402+
//Add the All API Diagnostics settings
403+
404+
templateResources.AddRange(await GetServiceDiagnosticsTemplateResourcesAsync(exc));
405+
406+
391407
armTemplate.resources = templateResources.ToArray();
392408
return armTemplate;
393409
}
@@ -766,5 +782,50 @@ private async Task<IEnumerable<TemplateResource>> GetRelatedTemplateResourcesAsy
766782

767783
return templateResources;
768784
}
785+
786+
/// <summary>
787+
/// Gets the "All API" level diagnostic resources, these are common to all APIs.
788+
/// </summary>
789+
/// <param name="exc">The extractor.</param>
790+
/// <returns>a list of DiagnosticTemplateResources</returns>
791+
private async Task<IEnumerable<TemplateResource>> GetServiceDiagnosticsTemplateResourcesAsync(Extractor exc)
792+
{
793+
List<TemplateResource> templateResources = new List<TemplateResource>();
794+
string apimname = exc.sourceApimName, resourceGroup = exc.resourceGroup;
795+
796+
string serviceDiagnostics = await GetServiceDiagnosticsAsync(apimname, resourceGroup);
797+
JObject oServiceDiagnostics = JObject.Parse(serviceDiagnostics);
798+
799+
foreach (var serviceDiagnostic in oServiceDiagnostics["value"])
800+
{
801+
string serviceDiagnosticName = ((JValue)serviceDiagnostic["name"]).Value.ToString();
802+
Console.WriteLine("'{0}' Diagnostic found", serviceDiagnosticName);
803+
804+
// convert returned diagnostic to template resource class
805+
DiagnosticTemplateResource serviceDiagnosticResource = serviceDiagnostic.ToObject<DiagnosticTemplateResource>();
806+
serviceDiagnosticResource.name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{serviceDiagnosticName}')]";
807+
serviceDiagnosticResource.type = ResourceTypeConstants.APIServiceDiagnostic;
808+
serviceDiagnosticResource.apiVersion = GlobalConstants.APIVersion;
809+
serviceDiagnosticResource.scale = null;
810+
serviceDiagnosticResource.dependsOn = new string[] { };
811+
812+
if (exc.paramApiLoggerId)
813+
{
814+
815+
serviceDiagnosticResource.properties.loggerId = $"[parameters('{ParameterNames.ApiLoggerId}').{ExtractorUtils.GenValidParamName(serviceDiagnosticName, ParameterPrefix.Diagnostic)}]";
816+
}
817+
818+
if (!serviceDiagnosticName.Contains("applicationinsights"))
819+
{
820+
// enableHttpCorrelationHeaders only works for application insights, causes errors otherwise
821+
//TODO: Check this settings still valid?
822+
serviceDiagnosticResource.properties.enableHttpCorrelationHeaders = null;
823+
}
824+
825+
templateResources.Add(serviceDiagnosticResource);
826+
}
827+
828+
return templateResources.ToArray();
829+
}
769830
}
770831
}

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/EntityExtractor.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,12 @@ public Template GenerateEmptyApiTemplateWithParameters(Extractor exc)
169169
}
170170
return armTemplate;
171171
}
172+
173+
public Template GenerateEmptyProductApiTemplateWithParameters(Extractor exc)
174+
{
175+
Template armTemplate = GenerateEmptyTemplate();
176+
armTemplate.parameters = new Dictionary<string, TemplateParameterProperties> { { ParameterNames.ApimServiceName, new TemplateParameterProperties() { type = "string" } } };
177+
return armTemplate;
178+
}
172179
}
173180
}

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/MasterTemplateExtractor.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public Template GenerateLinkedMasterTemplate(Template apiTemplate,
124124
if (productAPIsTemplate != null && productAPIsTemplate.resources.Count() != 0)
125125
{
126126
string productAPIsUri = GenerateLinkedTemplateUri(exc.linkedTemplatesUrlQueryString, exc.linkedTemplatesSasToken, fileNames.productAPIs);
127-
resources.Add(this.CreateLinkedMasterTemplateResourceWithPolicyToken("productAPIsTemplate", productAPIsUri, productAPIDependsOn.ToArray(), exc));
127+
resources.Add(this.CreateLinkedMasterTemplateResourceForProductAPITemplate("productAPIsTemplate", productAPIsUri, productAPIDependsOn.ToArray(), exc));
128128
}
129129

130130
// apiTags
@@ -184,6 +184,15 @@ public MasterTemplateResource CreateLinkedMasterTemplateResourceWithPolicyToken(
184184
}
185185
}
186186

187+
public MasterTemplateResource CreateLinkedMasterTemplateResourceForProductAPITemplate(string name, string uriLink, string[] dependsOn, Extractor exc)
188+
{
189+
MasterTemplateResource masterResourceTemplate = this.CreateLinkedMasterTemplateResource(name, uriLink, dependsOn);
190+
//Product API does not need the PolicyXMLBaseUrl parameter so remove it
191+
//(this needs to be addressed at a higher level because this parameter isn't needed for some resources
192+
masterResourceTemplate.properties.parameters.Remove(ParameterNames.PolicyXMLBaseUrl);
193+
return masterResourceTemplate;
194+
}
195+
187196
public MasterTemplateResource CreateLinkedMasterTemplateResourceForLoggerTemplate(string name, string uriLink, string[] dependsOn, Extractor exc)
188197
{
189198
MasterTemplateResource masterResourceTemplate = this.CreateLinkedMasterTemplateResource(name, uriLink, dependsOn);

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/ProductAPIExtractor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public async Task<List<TemplateResource>> GenerateSingleProductAPIResourceAsync(
6363
public async Task<Template> GenerateAPIProductsARMTemplateAsync(string singleApiName, List<string> multipleApiNames, Extractor exc)
6464
{
6565
// initialize arm template
66-
Template armTemplate = GenerateEmptyApiTemplateWithParameters(exc);
66+
Template armTemplate = GenerateEmptyProductApiTemplateWithParameters(exc);
6767
List<TemplateResource> templateResources = new List<TemplateResource>();
6868
// when extract single API
6969
if (singleApiName != null)

0 commit comments

Comments
 (0)