/// <summary> /// To push logs in Log Analytics Workspace /// </summary> /// <param name="json"></param> /// <param name="workspaceId"></param> /// <param name="sharedKey"></param> /// <param name="log"></param> /// <returns></returns> public static async Task <bool> PushLogsToLogAnalytics(string json, string logFileName, string workspaceId, string sharedKey, ILogger log) { try { // Create a hash for the API signature var datestring = DateTime.UtcNow.ToString("r"); var jsonBytes = Encoding.UTF8.GetBytes(json); string stringToHash = "POST\n" + jsonBytes.Length + "\napplication/json\n" + "x-ms-date:" + datestring + "\n/api/logs"; string hashedString = LogAnalyticsHelper.BuildSignature(stringToHash, sharedKey, log); log.LogInformation($"HashedString : {hashedString}"); string signature = "SharedKey " + workspaceId + ":" + hashedString; log.LogInformation($"Signature : " + signature); bool ingestionStatus = await LogAnalyticsHelper.IngestToLogAnalytics(signature, datestring, json, logFileName, workspaceId, log); return(ingestionStatus); } catch (Exception e) { log.LogInformation($"PushLogsToLogAnalytics got Exception \n Time: {DateTime.Now} \n Exception{e.Message} and complete Exception:{e}"); return(false); } }
public static async Task <HttpResponseMessage> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, ILogger log) { try { log.LogInformation("PushLogsToLogAnalytics Function Called"); //Get Request Data dynamic data = await req.Content.ReadAsAsync <object>(); string customLogFile = data.LogFileName; string automationName = data.AutomationName; string moduleName = data.ModuleName; string logData = Convert.ToString(data.LogData); //Parsing provided logData Json JObject logDataObj = JObject.Parse(logData); string logDataJson = logDataObj.ToString(Newtonsoft.Json.Formatting.Indented); //Preparing Final Json for Log Analytics Injection dynamic obj = new JObject(); obj.AutomationName = automationName; obj.ModuleName = moduleName; obj.Log = logDataJson; string myJson = obj.ToString(Newtonsoft.Json.Formatting.Indented); log.LogInformation("PreparedFinalJson : " + myJson); //Validating Json - User provided Log Data Json and prepared final Json bool isChildJsonValid = LogAnalyticsHelper.IsValidJson(logDataJson, log); bool isParentJsonValid = LogAnalyticsHelper.IsValidJson(myJson, log); if (isChildJsonValid && isParentJsonValid) { log.LogInformation("Fetching details from KeyVault"); log.LogInformation("Invoking FetchKeyVaultSecret method"); string workspaceId = await KeyVaultHelper.FetchKeyVaultSecret(ConstantsHelper.GetEnvironmentVariable(ConstantsHelper.logAnalyticsWorkspaceID), log); string primaryKey = await KeyVaultHelper.FetchKeyVaultSecret(ConstantsHelper.GetEnvironmentVariable(ConstantsHelper.logAnalyticsWorkspaceSharedKey), log); log.LogInformation("FetchKeyVaultSecret executed successfully"); //Invoking PushLogsToLogAnalytics method to ingest the logs into workspace bool status = await LogAnalyticsHelper.PushLogsToLogAnalytics(myJson, customLogFile, workspaceId, primaryKey, log); if (status) { log.LogInformation("Ingestion of log analytics is completed."); return(req.CreateResponse(HttpStatusCode.OK, "[Info] Ingestion of log analytics is completed.")); } else { log.LogInformation("Ingestion of log analytics is failed"); return(req.CreateResponse(HttpStatusCode.BadRequest, "[Error] Ingestion of log analytics is failed")); } } else { return(req.CreateResponse(HttpStatusCode.BadRequest, $"[Warning] Invalid Json Provided")); } } catch (System.Exception ex) { return(req.CreateResponse(HttpStatusCode.NotFound, $"{ex.Message}")); } }