public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jsonObject = JObject.Load(reader); var value = jsonObject.GetValue(nameof(AlertParameters.AlertType), StringComparison.OrdinalIgnoreCase); if (value.Type == JTokenType.Null) { return(null); } AlertParameters parameters; switch ((AlertType)value.Value <int>()) { case AlertType.Hashrate: parameters = new HashrateAlertParameters(); break; case AlertType.GpuThreshold: parameters = new GpuThresholdAlertParameters(); break; case AlertType.Connectivity: parameters = new ConnectivityAlertParameters(); break; default: throw new ArgumentOutOfRangeException(); } serializer.Populate(jsonObject.CreateReader(), parameters); return(parameters); }
private static AlertMetadata CreateMetadata(AlertMetadata existingMetadata, HashrateAlertParameters parameters, IEnumerable <Snapshot> snapshots) { var hashRates = snapshots .Select(s => (int?)s.MinerStatistics.Ethereum.Hashrate) .Union(new[] { existingMetadata?.Value?.Min, existingMetadata?.Value?.Max }) .ToList(); var metadata = new AlertMetadata { Value = new AlertValueMetadata { Condition = Condition.Low, Min = hashRates.Min(), Max = hashRates.Max() }, Threshold = new AlertThresholdMetadata { Min = parameters.MinValue } }; return(metadata); }
private static IEnumerable <ConditionPeriod> GetConditionPeriods(IEnumerable <Snapshot> snapshotsList, HashrateAlertParameters parameters) { Condition MapToCondition(Snapshot snapshot) { if (snapshot.MinerStatistics.Ethereum.Hashrate / 1000m < parameters.MinValue) { return(Condition.Low); } return(Condition.Ok); } return (from conditionPeriod in snapshotsList.ToConditionPeriods(MapToCondition) orderby conditionPeriod.Period.Start select conditionPeriod); }
private async Task <Alert> CreateAlertAsync(AlertDefinition definition, Miner miner, HashrateAlertParameters parameters, IEnumerable <Snapshot> snapshots, CancellationToken token) { var metadata = CreateMetadata(null, parameters, snapshots); var detailMessages = CreateDetailMessages(metadata, parameters); return(await _alertFactory.CreateAlertAsync(definition, miner, metadata, "Hashrate too low", detailMessages, token)); }
private static IEnumerable <string> CreateDetailMessages(AlertMetadata metadata, HashrateAlertParameters parameters) { var durationMessage = parameters.DurationMinutes == null ? null : $" for more than {parameters.DurationMinutes} minute(s)"; yield return($"Hashrate below threshold of {parameters.MinValue} MH/s{durationMessage}"); yield return($"Min hashrate speed during alert: {metadata.Value.Min / 1000m} MH/s"); yield return($"Max hashrate speed during alert: {metadata.Value.Max / 1000m} MH/s"); }