예제 #1
0
        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();
        }
예제 #2
0
        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));
        }