private async void AskPersistDeviceMetric(object state) { IOptionsSnapshot <CoreOptions> coreOptions = this.serviceProvider.GetRequiredService <IOptionsSnapshot <CoreOptions> >(); IOptionsSnapshot <DeviceOptions> deviceOptions = this.serviceProvider.GetRequiredService <IOptionsSnapshot <DeviceOptions> >(); using BjdireContext db = this.serviceProvider.GetRequiredService <BjdireContext>(); foreach (DeviceOptionsEntry d in deviceOptions.Value.Devices) { try { byte[] id = d.ComputeIdBinary(); if (this.plcManager.PlcDictionary.TryGetValue(ByteString.CopyFrom(id), out PlcClient client)) { this.logger.LogInformation("Ask metric for {0}({1})", d.Id, d.Name); GrpcMetric metric = await client .GetMetricAsync( new GetMetricRequest(), DateTime.UtcNow.AddMilliseconds( coreOptions.Value.DefaultReadTimeoutMillis)) .ConfigureAwait(false); var m = new ModelMetric { DeviceId = BitConverter.ToString(id), }; metric.AssignTo(m); db.Metrics.Add(m); } else { this.logger.LogWarning( "Failed to ask metric for {0}({1}), currently offline.", d.Id, d.Name); } } catch (RpcException e) { this.logger.LogWarning(e, "Failed to ask metric for {0}({1})", d.Id, d.Name); } } db.SaveChanges(); }
public override Task <ListMetricsResponse> ListMetrics(ListMetricsRequest request, ServerCallContext context) { string id = BitConverter.ToString(request.DeviceId.ToByteArray()); DateTimeOffset endDateTime; if (string.IsNullOrEmpty(request.PageToken)) { endDateTime = request.EndTime?.ToDateTimeOffset() ?? DateTimeOffset.UtcNow; } else { endDateTime = DateTimeOffset.Parse(request.PageToken, CultureInfo.InvariantCulture); } endDateTime = endDateTime.ToUniversalTime(); DateTimeOffset?startDateTime = request.StartTime?.ToDateTimeOffset().ToUniversalTime(); var response = new ListMetricsResponse(); using (BjdireContext db = this.serviceProvider.GetRequiredService <BjdireContext>()) { var metrics = (from m in db.Metrics where m.DeviceId == id && (startDateTime == null || startDateTime <= m.Timestamp) && m.Timestamp <= endDateTime orderby m.Timestamp descending select m) .Take(request.PageSize) .ToList(); response.Metrics.AddRange(metrics.Select(metric => { var m = new GrpcMetric(); m.AssignFrom(metric); return(m); })); if (metrics.Count == request.PageSize && metrics.Last().Timestamp > startDateTime) { response.NextPageToken = metrics.Last().Timestamp .ToUniversalTime() .ToString(CultureInfo.InvariantCulture); } } return(Task.FromResult(response)); }