コード例 #1
0
ファイル: Program.cs プロジェクト: optical/Flick2Influx
        public static void Main(string[] args)
        {
            CommandLine.Parser.Default.ParseArguments <Config>(args)
            .WithParsed(options => {
                var collectorConfig = new CollectorConfiguration()
                                      .WriteTo.InfluxDB(options.InfluxUri, options.InfluxDatabase, options.InfluxUsername, options.InfluxPassword);

                CollectorLog.RegisterErrorHandler((message, exception) => {
                    Console.Error.WriteLine($"Error when recording influx stats: \"{message}\"");
                    Console.Error.WriteLine(exception);
                });

                using (var influxCollector = collectorConfig.CreateCollector()) {
                    if (options.Mode.Equals(PriceMode, StringComparison.InvariantCultureIgnoreCase))
                    {
                        RecordCurrentPrice(options, influxCollector).GetAwaiter().GetResult();
                    }
                    else if (options.Mode.Equals(UsageSimpleMode, StringComparison.InvariantCultureIgnoreCase))
                    {
                        RecordSimpleHistoricUsage(options, influxCollector).GetAwaiter().GetResult();
                    }
                    else if (options.Mode.Equals(UsageDetailedMode, StringComparison.InvariantCultureIgnoreCase))
                    {
                        RecordDetailedHistoricUsage(options, influxCollector).GetAwaiter().GetResult();
                    }
                    else
                    {
                        Console.Error.WriteLine($"Unrecognized mode \"{options.Mode}\" A valid --mode of either \"{PriceMode}\", \"{UsageSimpleMode}\" or \"{UsageDetailedMode}\" must be specified");
                        Environment.Exit(1);
                    }
                }
            });
        }
コード例 #2
0
        void OnTick()
        {
            try
            {
                Queue <PointData> batch;
                lock (_queueLock)
                {
                    if (_queue.Count == 0)
                    {
                        return;
                    }

                    batch  = _queue;
                    _queue = new Queue <PointData>();
                }

                _parent.Emit(batch.ToArray());
            }
            catch (Exception ex)
            {
                CollectorLog.WriteLine("Failed to emit metrics batch: {0}", ex);
            }
            finally
            {
                lock (_stateLock)
                {
                    if (!_unloading)
                    {
                        _timer.Start(_interval);
                    }
                }
            }
        }
コード例 #3
0
        public async Task <bool> Log(string user_id, string item_id, string event_type, string session_id)
        {
            Contoso.Apps.Movies.Data.Models.User user = (Contoso.Apps.Movies.Data.Models.User)Session["User"];

            if (user != null)
            {
                string name   = user.Email;
                int    userId = user.UserId;

                Item i = await DbHelper.GetItem(int.Parse(item_id));

                if (i != null)
                {
                    CollectorLog log = new CollectorLog();
                    log.id        = Guid.NewGuid().ToString();
                    log.UserId    = userId.ToString();
                    log.ContentId = i.ImdbId;
                    log.ItemId    = item_id;
                    log.Event     = event_type;
                    log.SessionId = session_id;
                    log.Created   = DateTime.Now;

                    //add to cosmos db
                    var container = client.GetContainer(databaseId, "events");
                    await container.CreateItemAsync(log);
                }
            }

            return(true);
        }
コード例 #4
0
        public HubitatClient(HubitatOptions options, ILogger logger)
        {
            _options = options;
            _logger  = logger;

            var socketOptions = new PureWebSocketOptions()
            {
                DebugMode           = true,
                SendDelay           = 100,
                IgnoreCertErrors    = true,
                MyReconnectStrategy = new ReconnectStrategy(options.MinReconnectInterval, options.MaxReconnectInterval, options.MaxReconnectAttempts)
            };

            _webSocket                 = new PureWebSocket(_options.WebSocketURL, socketOptions);
            _webSocket.OnOpened       += (sender) => SocketOpen();
            _webSocket.OnStateChanged += (sender, newState, previousState) => SocketStateChanged(newState, previousState);
            _webSocket.OnMessage      += (sender, message) => MessageReceived(message);
            _webSocket.OnClosed       += (sender, reason) => SocketClosed(reason);
            _webSocket.OnSendFailed   += (sender, data, ex) => SocketSendFailed(data, ex);
            _webSocket.OnError        += (sender, e) => SocketError(e);

            _collector = Metrics.Collector = new CollectorConfiguration()
                                             .Batch.AtInterval(TimeSpan.FromSeconds(options.BatchInterval))
                                             .WriteTo.InfluxDB(options.InfluxDbURL, options.InfluxDbDatabase, options.InfluxDbUsername, options.InfluxDbPassword)
                                             .CreateCollector();

            CollectorLog.RegisterErrorHandler((string message, Exception ex) =>
            {
                _logger.Error(ex, "Failed to write metrics to InfluxDB: {Message}", message);
            });
        }
コード例 #5
0
        Task OnTick()
        {
            try
            {
                Queue <PointData> batch;
                lock (_queueLock)
                {
                    if (_queue.Count == 0)
                    {
                        return(Task.Delay(0));
                    }

                    batch  = _queue;
                    _queue = new Queue <PointData>();
                }

                _parent.Emit(batch.ToArray());
            }
            catch (Exception ex)
            {
                CollectorLog.ReportError("Failed to emit metrics batch", ex);
            }
            finally
            {
                lock (_stateLock)
                {
                    if (!_unloading)
                    {
                        _timer.Start(_interval);
                    }
                }
            }

            return(Task.Delay(0));
        }
コード例 #6
0
        private static void LogWeatherData(Object source, ElapsedEventArgs e)
        {
            var weather = FetchWeatherData();

            CollectorLog.RegisterErrorHandler((message, exception) =>
            {
                Console.WriteLine($"{message}: {exception}");
            });

            Metrics.Collector = new CollectorConfiguration()
                                .Tag.With("location", Zipcode)
                                .WriteTo.InfluxDB(InfluxDBUrl, "weather", InfluxDBUsername, InfluxDBPassword)
                                .CreateCollector();

            Console.WriteLine("Writing data to InfluxDb...");
            Metrics.Write("weather",
                          new Dictionary <string, object>
            {
                { "temperature", weather.Temperature },
                { "pressure", weather.Pressure },
                { "humidity", weather.Humidity },
                { "wind-speed", weather.WindSpeed },
                { "wind-direction", weather.WindDirection },
                { "clouds", weather.Clouds }
            });

            Metrics.Collector.Dispose();
        }
コード例 #7
0
ファイル: Program.cs プロジェクト: foliba/influxtest
        private static async Task Main(string[] args)
        {
            Console.WriteLine("Hello Old World!");

            CollectorLog.RegisterErrorHandler((message, exception) =>
            {
                Console.WriteLine($"{message}: {exception}");
            });

            var client = new LineProtocolClient(new Uri(DBUrl), DBName);

            var createEvents = new LineProtocolPayload();

            for (var i = 0; i < PlanAmount; i++)
            {
                createEvents.Add(Create_PlanCreateDTO().ToLineProtocolPoint());
            }

            var influxResult = await client.WriteAsync(createEvents);

            if (!influxResult.Success)
            {
                await Console.Error.WriteLineAsync(influxResult.ErrorMessage);
            }

            var changeEvents = new LineProtocolPayload();

            PlanIDs.ForEach(planId =>
            {
                for (var i = 0; i < ChangeEventPerPlanAmount; i++)
                {
                    changeEvents.Add(Create_PlanChangeValueDTO(planId, i).ToLineProtocolPoint());
                }
            });
            influxResult = await client.WriteAsync(changeEvents);

            if (!influxResult.Success)
            {
                await Console.Error.WriteLineAsync(influxResult.ErrorMessage);
            }

            var deleteEvents = new LineProtocolPayload();

            PlanIDs.ForEach(planId =>
            {
                deleteEvents.Add(new PlanDeleteDTO
                {
                    PlanId      = planId,
                    UserId      = "1234567",
                    PlanVersion = new Version(1, 2).ToString()
                }.ToLineProtocolPoint());
            });
            influxResult = await client.WriteAsync(deleteEvents);

            if (!influxResult.Success)
            {
                await Console.Error.WriteLineAsync(influxResult.ErrorMessage);
            }
        }
コード例 #8
0
 public InfluxDBRepository(string uri, string database, string measurement)
 {
     this.uri         = uri;
     this.database    = database;
     this.measurement = measurement;
     CollectorLog.RegisterErrorHandler((message, exception) =>
     {
         throw new Exception(message, exception);
     });
 }
コード例 #9
0
        public void ListenerCanUnregister()
        {
            var invocationCount = 0;

            using (CollectorLog.RegisterErrorHandler((message, exception) => invocationCount++))
            {
                CollectorLog.ReportError("", null);
            }
            CollectorLog.ReportError("", null);
            Assert.Equal(1, invocationCount);
        }
コード例 #10
0
        public InfluxCollector(IConfiguration configuration, ILogger <InfluxCollector> logger)
        {
            var url      = configuration.GetValue <string>("influxdb:url");
            var database = configuration.GetValue <string>("influxdb:database");

            Metrics.Collector = new CollectorConfiguration()
                                .Batch.AtInterval(TimeSpan.FromSeconds(2))
                                .WriteTo.InfluxDB(url, database)
                                .CreateCollector();
            CollectorLog.RegisterErrorHandler((message, exception) => logger.LogError(exception, message));
        }
コード例 #11
0
        public MetricsCollectorWrapper(string serverBaseAddress, string database, TimeSpan interval)
        {
            Collector = new CollectorConfiguration()
                        .Batch.AtInterval(interval)
                        .WriteTo.InfluxDB(serverBaseAddress, database)
                        .CreateCollector();

            CollectorLog.RegisterErrorHandler((message, exception) =>
            {
                Console.Error.WriteLine($"[{DateTime.Now}] - {message}: {exception}");
            });
        }
コード例 #12
0
 public void Write(string measurement, IReadOnlyDictionary <string, object> fields, IReadOnlyDictionary <string, string> tags = null, DateTime?timestamp = null)
 {
     try
     {
         var point = new PointData(measurement, fields, tags, timestamp ?? DateTime.UtcNow);
         Emit(new[] { point });
     }
     catch (Exception ex)
     {
         CollectorLog.ReportError("Failed to write point", ex);
     }
 }
コード例 #13
0
        public void SingleListenerGetsInvoked()
        {
            var          invocationCount = 0;
            Exception    dummyException  = new Exception("Bang!");
            const string errorMessage    = "Bad things";

            CollectorLog.RegisterErrorHandler((message, exception) =>
            {
                Assert.Equal(errorMessage, message);
                Assert.Equal(dummyException, exception);
                invocationCount++;
            });

            CollectorLog.ReportError(errorMessage, dummyException);
            Assert.Equal(1, invocationCount);
        }
コード例 #14
0
        public void Emit(PointData[] points)
        {
            var payload = new LineProtocolPayload();

            foreach (var point in points)
            {
                payload.Add(new LineProtocolPoint(point.Measurement, point.Fields, point.Tags, point.UtcTimestamp));
            }

            var influxResult = _client.WriteAsync(payload).Result;

            if (!influxResult.Success)
            {
                CollectorLog.WriteLine(influxResult.ErrorMessage);
            }
        }
コード例 #15
0
        public async static void GenerateAction(int userId, string itemId, string eventType, string sessionId)
        {
            Console.WriteLine($"{userId} performed {eventType}");

            CollectorLog log = new CollectorLog();

            log.id        = Guid.NewGuid().ToString();
            log.UserId    = userId.ToString();
            log.ItemId    = itemId;
            log.Event     = eventType;
            log.SessionId = sessionId;
            log.Created   = DateTime.Now;

            //add to cosmos db
            var container = client.GetContainer(databaseId, "events");
            var item      = await container.CreateItemAsync(log);
        }
コード例 #16
0
        Task OnTick()
        {
            try
            {
                Queue <PointData> batch;
                lock (_queueLock)
                {
                    if (_queue.Count == 0)
                    {
                        return(Task.Delay(0));
                    }

                    batch  = _queue;
                    _queue = new Queue <PointData>();
                }

                if (_maxBatchSize == null || batch.Count <= _maxBatchSize.Value)
                {
                    _parent.Emit(batch.ToArray());
                }
                else
                {
                    foreach (var chunk in batch.Batch(_maxBatchSize.Value))
                    {
                        _parent.Emit(chunk.ToArray());
                    }
                }
            }
            catch (Exception ex)
            {
                CollectorLog.ReportError("Failed to emit metrics batch", ex);
            }
            finally
            {
                lock (_stateLock)
                {
                    if (!_unloading)
                    {
                        _timer.Start(_interval);
                    }
                }
            }

            return(Task.Delay(0));
        }
コード例 #17
0
        async void OnTick()
        {
            try
            {
                lock (_stateLock)
                {
                    if (_disposed)
                    {
                        return;
                    }

                    // There's a little bit of raciness here, but it's needed to support the
                    // current API, which allows the tick handler to reenter and set the next interval.

                    if (_running)
                    {
                        Monitor.Wait(_stateLock);

                        if (_disposed)
                        {
                            return;
                        }
                    }

                    _running = true;
                }

                if (!_cancel.Token.IsCancellationRequested)
                {
                    await _onTick(_cancel.Token);
                }
            }
            catch (OperationCanceledException tcx)
            {
                CollectorLog.ReportError("The timer was canceled during invocation", tcx);
            }
            finally
            {
                lock (_stateLock)
                {
                    _running = false;
                    Monitor.PulseAll(_stateLock);
                }
            }
        }
コード例 #18
0
ファイル: Program.cs プロジェクト: foliba/influxtest
        private static async Task Main(string[] args)
        {
            CollectorLog.RegisterErrorHandler((message, exception) =>
            {
                Console.WriteLine($"{message}: {exception}");
            });

            Console.WriteLine("Hello New World!");

            var influxDBClient = InfluxDBClientFactory.Create(DbUrl, Token);

            using (var writeApi = influxDBClient.GetWriteApi())
            {
                //    create events
                for (var i = 0; i < PlanAmount; i++)
                {
                    writeApi.WriteMeasurement(BucketName, OrgId, WritePrecision.Ns, Create_PlanCreateDTO());
                }

                //    change events
                PlanIDs.ForEach(planId =>
                {
                    for (var i = 0; i < ChangeEventPerPlanAmount; i++)
                    {
                        writeApi.WriteMeasurement(BucketName, OrgId, WritePrecision.Ns,
                                                  Create_PlanChangeValueDTO(planId, i));
                    }
                });

                //    delete events
                PlanIDs.ForEach(planId => writeApi.WriteMeasurement(BucketName, OrgId, WritePrecision.Ns,
                                                                    new PlanDeleteDTO
                {
                    PlanId      = planId,
                    UserId      = "12345",
                    PlanVersion = new Version(1, 2).ToString()
                })
                                );

                writeApi.Dispose();
            }

            await Read(influxDBClient);
        }
コード例 #19
0
        public static MetricsCollector connection; // to InfluxDB

        public static void Initialize()
        {
            DotEnv.Config();
            var envReader = new EnvReader();
            var address   = envReader.GetStringValue("INFLUX_ADDRESS");
            var dbname    = envReader.GetStringValue("INFLUX_DBNAME");
            var username  = envReader.GetStringValue("INFLUX_USERNAME");
            var password  = envReader.GetStringValue("INFLUX_PASSWORD");

            connection = new CollectorConfiguration()
                         .Tag.With("host", "client1")
                         .Batch.AtInterval(TimeSpan.FromSeconds(5))
                         .WriteTo.InfluxDB(address, dbname, username, password)
                         .CreateCollector();
            CollectorLog.RegisterErrorHandler((m, e) =>
            {
                Console.WriteLine($"{m}: {e}");
            });
        }
コード例 #20
0
        public void EnsureListenerExceptionPropagates()
        {
            CollectorLog.RegisterErrorHandler((message, exception) =>
            {
                throw new Exception("");
            });

            var threw = false;

            try
            {
                CollectorLog.ReportError("", null);
            }
            catch
            {
                threw = true;
            }
            Assert.True(threw, "Excpected an exception thrown by the error handler to propagate to the caller");
        }
コード例 #21
0
 public InfluxDBRepository(
     string uri,
     string database,
     string measurement,
     string username = null,
     string password = null,
     Action <string, Exception> errorHandler = null)
 {
     this.uri         = uri;
     this.database    = database;
     this.measurement = measurement;
     this.username    = username;
     this.password    = password;
     metricsCollector = Metrics.Collector = new CollectorConfiguration()
                                            .Batch.AtInterval(TimeSpan.FromSeconds(2))
                                            .WriteTo.InfluxDB(uri, database, username, password)
                                            .CreateCollector();
     if (errorHandler != null)
     {
         CollectorLog.RegisterErrorHandler(errorHandler);
     }
 }
コード例 #22
0
 public async static Task <int> CreateEvent(CollectorLog log)
 {
     _dbContext.Events.Add(log);
     return(await _dbContext.SaveChangesAsync());
 }
コード例 #23
0
ファイル: Program.cs プロジェクト: anticodeninja/antimetrics
        void Run(string[] args)
        {
            AppDomain.CurrentDomain.ProcessExit += (sender, eventArgs) => _active = false;
            Console.CancelKeyPress += (sender, eventArgs) =>
            {
                eventArgs.Cancel = true;
                _active          = false;
            };

            var result = new ArgsParser(args)
                         .Help("?", "help")
                         .Comment("antimetrics is an application for a process health metrics collection (like cpu and memory consumptions) via API and ETW\n" +
                                  "counters and publishing them into an database for further analyses.")
                         .Keys("v", "verbose").Tip("increase output verbosity").Flag(out _verbose)
                         .Keys("no-proxy").Tip("disable proxy usage").Flag(out var noProxy)
                         .Keys("with-influx").Tip("enable influx usage and set its address (ex. http://127.0.0.1:8086)").Value <string>(out var influxAddress, null)
                         .Keys("with-dumps").Tip("enable auto dumping and set its directory (ex. C:\\dumps)").Value <string>(out _dumpsDirectory, null)
                         .Name("process").Amount(1, int.MaxValue).Tip("list of process names for monitoring").Values <string>(out var processes)
                         .Result();

            if (result != null)
            {
                Console.WriteLine(result);
                return;
            }

            if (noProxy > 0)
            {
                HttpClient.DefaultProxy = new DisableSystemProxy();
            }
            CollectorLog.RegisterErrorHandler((message, exception) =>
            {
                if (_verbose >= 1)
                {
                    Console.WriteLine($"{message}: {exception}");
                }
            });

            for (var i = 0; i < processes.Count; ++i)
            {
                if (FindProcessByPid(processes[i], out var process))
                {
                    _monitoredProcesses[processes[i]] = new ProcessState
                    {
                        Pid     = process.Id,
                        Name    = process.ProcessName,
                        Process = process,
                    };
                }
                else
                {
                    _monitoredProcesses[processes[i]] = new ProcessState
                    {
                        Pid  = FORBIDDEN_ID,
                        Name = processes[i],
                    };
                }
            }

            foreach (var process in _monitoredProcesses.Values)
            {
                process.Concurrency        = new long[Environment.ProcessorCount + 1];
                process.ConcurrencyLast    = 0;
                process.ConcurrencyCounter = 0;
                process.Threads            = new ConcurrentDictionary <int, ThreadState>();

                if (influxAddress != null)
                {
                    process.Collector = new CollectorConfiguration()
                                        .Tag.With("host", Environment.GetEnvironmentVariable("COMPUTERNAME"))
                                        .Tag.With("app", process.Name)
                                        .Batch.AtInterval(TimeSpan.FromSeconds(5))
                                        .WriteTo.InfluxDB(influxAddress, DB_NAME)
                                        .CreateCollector();
                }

                process.Process ??= Process.GetProcesses().FirstOrDefault(x => x.ProcessName == process.Name);
                if (process.Process != null)
                {
                    Console.WriteLine("Process {0} is already active, pid {1}", process.Name, process.Process.Id);
                    process.Pid = process.Process.Id;
                    _activeProcesses[process.Pid] = process;
                }
                else
                {
                    Console.WriteLine("Process {0} is not found, waiting...", process.Name);
                }
            }

            _nextReport = Environment.TickCount64 + REP_INTERVAL;
            _reportId   = 0;

            _active = true;
            // ETW works quite unstable for PerformanceCounters and MemInfo events, so get them through good old API
            var apiCollector = new Thread(ApiCollector)
            {
                Name = "API Collector"
            };

            apiCollector.Start();

            var etwCollector = new Thread(EtwCollector)
            {
                Name = "ETW Collector"
            };

            etwCollector.Start();

            MainWorker();

            _session.Stop();
            apiCollector.Join();
            etwCollector.Join();
        }
コード例 #24
0
 public void CanReportWithoutListeners()
 {
     CollectorLog.ReportError("", null);
 }
コード例 #25
0
 public CollectorLogTests()
 {
     CollectorLog.ClearHandlers();
 }
コード例 #26
0
 public void DisallowNullErrorHandlers()
 {
     Assert.Throws <ArgumentNullException>(() => CollectorLog.RegisterErrorHandler(null));
 }
コード例 #27
0
 public void Dispose()
 {
     CollectorLog.ClearHandlers();
 }