Esempio n. 1
0
        public override ValueTask <CheckResult> CheckAsync(RiasCommandContext context)
        {
            var localization = context.Services.GetRequiredService <Localization>();

            var isValid = Contexts switch
            {
                ContextType.Guild when context.Guild is not null => true,
                ContextType.DM when context.Guild is null => true,
                _ => false
            };

            if (isValid)
            {
                return(CheckResult.Successful);
            }

            var guildId  = context.Guild?.Id;
            var contexts = Contexts.ToString()
                           .Split(",", StringSplitOptions.RemoveEmptyEntries)
                           .Select(x => localization.GetText(guildId, Localization.CommonContextType(x.ToLower())));

            var contextsHumanized = contexts.Humanize(x => $"**{x}**", localization.GetText(guildId, Localization.CommonOr).ToLowerInvariant());

            return(CheckResult.Failed(localization.GetText(guildId, Localization.AttributeContext, contextsHumanized)));
        }
    }
        public override Task <CheckResult> PerformCheck()
        {
            var dataPathRoot = Path.GetPathRoot(dataPath);

            if (dataPathRoot == null)
            {
                throw new Exception($"Unable to find the root of the data path {dataPath}");
            }

            var dataDriveInfo      = new DriveInfo(dataPathRoot);
            var availableFreeSpace = (decimal)dataDriveInfo.AvailableFreeSpace;
            var totalSpace         = (decimal)dataDriveInfo.TotalSize;

            var percentRemaining = (decimal)dataDriveInfo.AvailableFreeSpace / dataDriveInfo.TotalSize;

            if (Logger.IsDebugEnabled)
            {
                Logger.Debug($"Free space: {availableFreeSpace} | Total: {totalSpace} | Percent remaining {percentRemaining:P0}");
            }

            if (percentRemaining > percentageThreshold)
            {
                return(CheckResult.Pass);
            }

            var message = $"{percentRemaining:P0} disk space remaining on data drive '{dataDriveInfo.VolumeLabel} ({dataDriveInfo.RootDirectory})' on '{Environment.MachineName}'.";

            Logger.Warn(message);
            return(CheckResult.Failed(message));
        }
Esempio n. 3
0
 public override async Task <CheckResult> PerformCheck()
 {
     try
     {
         using (HttpClient client = new HttpClient
         {
             Timeout = TimeSpan.FromSeconds(3),
         })
             using (var response = await client.GetAsync(uri))
             {
                 if (response.IsSuccessStatusCode)
                 {
                     logger.InfoFormat("Succeeded in contacting {0}", uri);
                     return(CheckResult.Pass);
                 }
                 string error = $"Failed to contact '{uri}'. HttpStatusCode: {response.StatusCode}";
                 logger.Info(error);
                 return(CheckResult.Failed(error));
             }
     }
     catch (Exception exception)
     {
         string error = $"Failed to contact '{uri}'. Error: {exception.Message}";
         logger.Info(error);
         return(CheckResult.Failed(error));
     }
 }
        public override async Task <CheckResult> PerformCheck()
        {
            if (!runCheck)
            {
                return(CheckResult.Pass);
            }

            Logger.Debug("Checking Dead Letter Queue length");
            var managementClient = new ManagementClient(connectionString);

            try
            {
                var queueRuntimeInfo = await managementClient.GetQueueRuntimeInfoAsync(stagingQueue).ConfigureAwait(false);

                var deadLetterMessageCount = queueRuntimeInfo.MessageCountDetails.DeadLetterMessageCount;

                if (deadLetterMessageCount > 0)
                {
                    var result = $"{deadLetterMessageCount} messages in the Dead Letter Queue '{stagingQueue}'. This could indicate a problem with ServiceControl's retries. Please submit a support ticket to Particular using [email protected] if you would like help from our engineers to ensure no message loss while resolving these dead letter messages.";

                    Logger.Warn(result);
                    return(CheckResult.Failed(result));
                }

                Logger.Debug("No messages in Dead Letter Queue");
            }
            finally
            {
                await managementClient.CloseAsync().ConfigureAwait(false);
            }

            return(CheckResult.Pass);
        }
Esempio n. 5
0
 public override CheckResult PerformCheck()
 {
     using (HttpClient client = new HttpClient {
         Timeout = TimeSpan.FromSeconds(3),
     })
     {
         try
         {
             using (HttpResponseMessage response = client.GetAsync(uri).Result)
             {
                 if (response.IsSuccessStatusCode)
                 {
                     logger.Info("Succeeded in contacting " + uri);
                     return(CheckResult.Pass);
                 }
                 string error = string.Format("Failed to contact '{0}'. HttpStatusCode: {1}", uri, response.StatusCode);
                 logger.Info(error);
                 return(CheckResult.Failed(error));
             }
         }
         catch (Exception exception)
         {
             string error = string.Format("Failed to contact '{0}'. Error: {1}", uri, exception.Message);
             logger.Info(error);
             return(CheckResult.Failed(error));
         }
     }
 }
        void Run(object state)
        {
            CheckResult result;

            try
            {
                result = periodicCheck.PerformCheck();
            }
            catch (Exception ex)
            {
                var reason = String.Format("'{0}' implementation failed to run.", periodicCheck.GetType());
                result = CheckResult.Failed(reason);
                Logger.Error(reason, ex);
            }

            try
            {
                ReportToBackend(result, periodicCheck.Id, periodicCheck.Category,
                                TimeSpan.FromTicks(periodicCheck.Interval.Ticks * 4));
            }
            catch (Exception ex)
            {
                Logger.Error("Failed to report periodic check to ServiceControl.", ex);
            }
        }
Esempio n. 7
0
        public override ValueTask <CheckResult> CheckAsync(RiasCommandContext context)
        {
            var localization = context.Services.GetRequiredService <Localization>();

            var currentMember = context.CurrentMember;

            if (currentMember is null)
            {
                return(context.Command.Checks.Any(x => x is ContextAttribute contextAttribute && contextAttribute.Contexts.HasFlag(ContextType.Guild))
                    ? CheckResult.Successful
                    : CheckResult.Failed(localization.GetText(null, Localization.AttributeBotPermissionNotGuild)));
            }

            var guildPermissions    = currentMember.GetPermissions();
            var hasGuildPermissions = guildPermissions.HasPermission(Permissions);

            var channelPermissions = currentMember.PermissionsIn(context.Channel);
            var hasChannelPerm     = channelPermissions.HasPermission(Permissions);

            if (!hasGuildPermissions && !hasChannelPerm)
            {
                var guildPermsHumanized = HumanizePermissions(context.Guild !, guildPermissions, localization);
                return(CheckResult.Failed(localization.GetText(context.Guild !.Id, Localization.AttributeBotGuildPermissions, guildPermsHumanized)));
            }

            if (hasGuildPermissions && !hasChannelPerm)
            {
                var channelPermsHumanized = HumanizePermissions(context.Guild !, channelPermissions, localization);
                return(CheckResult.Failed(localization.GetText(context.Guild !.Id, Localization.AttributeBotChannelPermissions, channelPermsHumanized)));
            }

            return(CheckResult.Successful);
        }
Esempio n. 8
0
 public override CheckResult PerformCheck()
 {
     try
     {
         using (var client = new HttpClient
         {
             Timeout = TimeSpan.FromSeconds(3),
         })
             using (var response = client.GetAsync(url).Result)
             {
                 if (response.IsSuccessStatusCode)
                 {
                     log.Info($"Succeeded in contacting {url}");
                     return(CheckResult.Pass);
                 }
                 var error = $"Failed to contact '{url}'. HttpStatusCode: {response.StatusCode}";
                 log.Info(error);
                 return(CheckResult.Failed(error));
             }
     }
     catch (Exception exception)
     {
         var error = $"Failed to contact '{url}'. Error: {exception.Message}";
         log.Info(error);
         return(CheckResult.Failed(error));
     }
 }
Esempio n. 9
0
    public override async Task <CheckResult> PerformCheck()
    {
        var start = Stopwatch.StartNew();

        try
        {
            if (DateTime.UtcNow.Minute % 2 == 0)
            {
                throw new InvalidOperationException("Current minute is even so I'm failing.");
            }
            using (var client = new HttpClient {
                Timeout = TimeSpan.FromSeconds(30)
            })
                using (var response = await client.GetAsync(url)
                                      .ConfigureAwait(false))
                {
                    if (response.IsSuccessStatusCode)
                    {
                        log.Info($"Succeeded in contacting {url}");
                        return(CheckResult.Pass);
                    }
                    var error = $"Failed to contact '{url}'. HttpStatusCode: {response.StatusCode}";
                    log.Info(error);
                    return(CheckResult.Failed(error));
                }
        }
        catch (Exception exception)
        {
            var error = $"Failed to contact '{url}'. Duration: {start.Elapsed} Error: {exception.Message}";
            log.Info(error);
            return(CheckResult.Failed(error));
        }
    }
Esempio n. 10
0
        public override Task <CheckResult> PerformCheck()
        {
            Logger.Debug("Checking Dead Letter Queue length");
            float  currentValue;
            string result;

            try
            {
                if (dlqPerformanceCounter == null)
                {
                    throw new InvalidOperationException("Unable to create performance counter instance.");
                }

                currentValue = dlqPerformanceCounter.NextValue();
            }
            catch (InvalidOperationException ex)
            {
                result = CounterMightBeLocalized(categoryName, counterName, counterInstanceName);
                Logger.Warn(result, ex);
                return(CheckResult.Failed(result));
            }

            if (currentValue <= 0)
            {
                Logger.Debug("No messages in Dead Letter Queue");
                return(CheckResult.Pass);
            }

            result = MessagesInDeadLetterQueue(currentValue);
            Logger.Warn(result);
            return(CheckResult.Failed(result));
        }
        public override Task <CheckResult> PerformCheck()
        {
            var failure = criticalErrorHolder.GetLastFailure();

            return(failure == null
                ? successResult
                : Task.FromResult(CheckResult.Failed(failure)));
        }
        public override Task <CheckResult> PerformCheck()
        {
            //code: try Ping service

            //CheckResult.Pass or CheckResult.Failed with an indicator of why it failed
            //so can see the custom check failing on the ServicePulse dashboard
            return(CheckResult.Failed("REST service not reachable"));
        }
 public override CheckResult PerformCheck()
 {
     if (Interlocked.Increment(ref counter) / 10 % 2 == 0)
     {
         return(CheckResult.Failed("fail!"));
     }
     return(CheckResult.Pass);
 }
 public override CheckResult PerformCheck()
 {
     if (SomeService.GetStatus())
     {
         return(CheckResult.Pass);
     }
     return(CheckResult.Failed("Some service is not available."));
 }
Esempio n. 15
0
        public override CheckResult PerformCheck()
        {
            if (rnd.Next(0, 1) == 0)
            {
                return(CheckResult.Pass);
            }

            return(CheckResult.Failed("Because I can"));
        }
Esempio n. 16
0
        public override ValueTask <CheckResult> CheckAsync(object argument, CommandContext context)
        {
            var u   = argument.Cast <SocketGuildUser>() ?? throw new ArgumentException($"Cannot use the CheckHierarchy attribute on a type that isn't {typeof(SocketGuildUser)}.");
            var ctx = context.Cast <VolteContext>();

            return(ctx.User.Id != u.Id
                ? CheckResult.Successful
                : CheckResult.Failed("You cannot run this command on yourself."));
        }
Esempio n. 17
0
        public override ValueTask <CheckResult> CheckAsync(object argument, CommandContext context)
        {
            var u   = argument.Cast <SocketGuildUser>() ?? throw new ArgumentException($"Cannot use the CheckHierarchy attribute on a type that isn't {typeof(SocketGuildUser)}.");
            var ctx = context.Cast <VolteContext>();

            return(ctx.User.Hierarchy >= u.Hierarchy
                ? CheckResult.Successful
                : CheckResult.Failed("Cannot ban someone in a higher, or equal, hierarchy position than yourself."));
        }
Esempio n. 18
0
                public override Task <CheckResult> PerformCheck()
                {
                    if (Interlocked.Increment(ref counter) / 5 % 2 == 1)
                    {
                        return(Task.FromResult(CheckResult.Failed("fail!")));
                    }

                    return(Task.FromResult(CheckResult.Pass));
                }
    public override CheckResult PerformCheck()
    {
        var currentValue = dlqPerformanceCounter.NextValue();

        if (currentValue <= 0)
        {
            return(CheckResult.Pass);
        }
        return(CheckResult.Failed($"{currentValue} messages in the Dead Letter Queue on {Environment.MachineName}"));
    }
Esempio n. 20
0
        public override CheckResult PerformCheck()
        {
            var dir = @"C:\Foo";

            if (!Directory.Exists(dir))
            {
                return(CheckResult.Failed(string.Format("Storage directory '{0}' does not exist", dir)));
            }
            return(CheckResult.Pass);
        }
                public override Task <CheckResult> PerformCheck()
                {
                    if (executed && context.SignalrStarted)
                    {
                        return(Task.FromResult(CheckResult.Failed("Some reason")));
                    }

                    executed = true;

                    return(Task.FromResult(CheckResult.Pass));
                }
Esempio n. 22
0
        public override ValueTask <CheckResult> CheckAsync(CommandContext context)
        {
            var ctx = context.Cast <VolteContext>();

            if (ctx.IsModerator(ctx.User))
            {
                return(CheckResult.Successful);
            }

            return(CheckResult.Failed("Insufficient permission."));
        }
Esempio n. 23
0
                public override CheckResult PerformCheck()
                {
                    if (executed && context.SignalrStarted)
                    {
                        return(CheckResult.Failed("Some reason"));
                    }

                    executed = true;

                    return(CheckResult.Pass);
                }
        public override Task <CheckResult> PerformCheck()
        {
            var lastFailure = recentFailure;

            if (lastFailure != null)
            {
                recentFailure = null;
                return(Task.FromResult(CheckResult.Failed(lastFailure)));
            }

            return(Task.FromResult(CheckResult.Pass));
        }
        public async Task <CheckResult> PerformCheck()
        {
            try
            {
                await client.GetAsync("/api/Service").ConfigureAwait(false);

                return(CheckResult.Pass);
            }
            catch (Exception e)
            {
                Console.WriteLine($"Check failed: {e.Message}");
                return(CheckResult.Failed(e.Message));
            }
        }
        public override CheckResult PerformCheck()
        {
            Logger.Debug("Checking Dead Letter Queue length");
            var currentValue = dlqPerformanceCounter.NextValue();

            if (currentValue <= 0)
            {
                Logger.Debug("No messages in Dead Letter Queue");
                return(CheckResult.Pass);
            }

            var result = $"{currentValue} messages in the Dead Letter Queue on {Environment.MachineName}. This could indicate a problem with ServiceControl's retries. Please submit a support ticket to Particular using [email protected] if you would like help from our engineers to ensure no message loss while resolving these dead letter messages.";

            Logger.Warn(result);
            return(CheckResult.Failed(result));
        }
Esempio n. 27
0
        public override async Task <CheckResult> PerformCheck()
        {
            using (var session = store.OpenAsyncSession())
            {
                var query = session.Query <FailedErrorImport, FailedErrorImportIndex>();
                using (var ie = await session.Advanced.StreamAsync(query).ConfigureAwait(false))
                {
                    if (await ie.MoveNextAsync().ConfigureAwait(false))
                    {
                        Logger.Warn(message);
                        return(CheckResult.Failed(message));
                    }
                }
            }

            return(CheckResult.Pass);
        }
Esempio n. 28
0
        public override async Task <CheckResult> PerformCheck()
        {
            var httpClient = httpClientFactory();

            try
            {
                var queryTimeout = TimeSpan.FromSeconds(10);
                using (var cancellationTokenSource = new CancellationTokenSource(queryTimeout))
                {
                    foreach (var remote in remoteInstanceSetting)
                    {
                        remoteQueryTasks.Add(CheckSuccessStatusCode(httpClient, remote, queryTimeout, cancellationTokenSource.Token));
                    }

                    try
                    {
                        await Task.WhenAll(remoteQueryTasks).ConfigureAwait(false);

                        return(CheckResult.Pass);
                    }
                    catch (Exception)
                    {
                        var builder = new StringBuilder();

                        foreach (var task in remoteQueryTasks)
                        {
                            try
                            {
                                await task.ConfigureAwait(false);
                            }
                            catch (TimeoutException e)
                            {
                                builder.AppendLine(e.Message);
                            }
                        }

                        return(CheckResult.Failed(builder.ToString()));
                    }
                }
            }
            finally
            {
                remoteQueryTasks.Clear();
            }
        }
        public override Task <CheckResult> PerformCheck()
        {
            Logger.Debug("Checking Dead Letter Queue length");

            var queueDescription    = namespaceManager.GetQueue(stagingQueue);
            var messageCountDetails = queueDescription.MessageCountDetails;

            if (messageCountDetails.DeadLetterMessageCount > 0)
            {
                var result = $"{messageCountDetails.DeadLetterMessageCount} messages in the Dead Letter Queue '{stagingQueue}'. This could indicate a problem with ServiceControl's retries. Please submit a support ticket to Particular using [email protected] if you would like help from our engineers to ensure no message loss while resolving these dead letter messages.";

                Logger.Warn(result);
                return(CheckResult.Failed(result));
            }

            Logger.Debug("No messages in Dead Letter Queue");
            return(CheckResult.Pass);
        }
Esempio n. 30
0
        public override async Task <CheckResult> PerformCheck()
        {
            using (var session = store.OpenAsyncSession())
            {
                var query = session.Query <FailedErrorImport, FailedErrorImportIndex>();
                using (var ie = await session.Advanced.StreamAsync(query).ConfigureAwait(false))
                {
                    if (await ie.MoveNextAsync().ConfigureAwait(false))
                    {
                        var message = @"One or more error messages have failed to import properly into ServiceControl and have been stored in the ServiceControl database.
The import of these messages could have failed for a number of reasons and ServiceControl is not able to automatically reimport them. For guidance on how to resolve this see https://docs.particular.net/servicecontrol/import-failed-audit-messages";

                        Logger.Warn(message);
                        return(CheckResult.Failed(message));
                    }
                }
            }

            return(CheckResult.Pass);
        }