Exemplo n.º 1
0
        /// <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}"));
            }
        }