Skip to main content

eb healthcheck.rb

rb code monitoring & send report HEALTH check

[ec2-user@ip-172-31-19-129 ~]$ cat /opt/elasticbeanstalk/lib/ruby/lib/ruby/gems/2.2.0/gems/healthd-appstat-1.0.1/lib/healthd-appstat/plugin.rb
require 'healthd/daemon/exceptions'
require 'healthd/daemon/logger'
require 'healthd/daemon/plugins/batch_base'
require 'healthd/daemon/model/statistic'
require 'healthd-appstat/log_file'
require 'healthd-appstat/http_status_counters'
require 'x-digest'
require 'chainsaw'

module Healthd
    module Plugins
        module Appstat
            class Plugin < Daemon::Plugins::BatchBase
                namespace "application"

                @@pattern = %["]
                @@units = %w[sec usec]
                @@timestamp_on_values = %w[completion arrival]
                @@unit = @@units.first
                @@timestamp_on = @@timestamp_on_values.first

                attr_accessor :path, :xdigest, :status_counters, :mode, :interval

                # don't use kwargs to workaround bugs in 2.2.2
                # - https://bugs.ruby-lang.org/issues/11091
                # - https://bugs.ruby-lang.org/issues/10693
                def initialize(**base_options)
                    path = base_options.delete(:path) { nil }
                    unit = base_options.delete(:unit) { nil }
                    timestamp_on = base_options.delete(:timestamp_on) { nil }
                    mode = base_options.delete(:mode) { 'follow' }
                    interval = base_options.delete(:interval) { nil }
                    pattern = base_options.delete(:pattern) { nil }
                    ext = base_options.delete(:ext) { true }

                    super base_options

                    @path = path || ENV['HEALTHD_APPSTAT_LOG'] || options.appstat_log_path
                    @unit = unit || options.appstat_unit || @@unit
                    @timestamp_on = timestamp_on || options.appstat_timestamp_on || @@timestamp_on
                    @mode = mode
                    @pattern = pattern || @@pattern
                    @interval = interval || @queue.collection_interval
                    @xdigest = XDigest.create :compression => 25
                    @status_counters = HTTPStatusCounters.new

                    unless @@units.include? @unit
                        raise Healthd::Exceptions::FatalError, %[invalid unit: "#{@unit}". supported units: #{@@units.join ', '}]
                    end

                    unless @@timestamp_on_values.include? @timestamp_on
                        raise Healthd::Exceptions::FatalError, %[invalid timestamp-on value: "#{@timestamp_on}". supported values: #{@@timestamp_on_values.join ', '}]
                    end

                    @usec = (@unit == 'usec')
                    @arrival = (@timestamp_on == 'arrival')

                    # sample log format for nginx:
                    #
                    #   log_format healthd '$msec"$uri"'
                    #                   '$status"$request_time"$upstream_response_time"'
                    #                   '$http_x_forwarded_for';
                    #
                    #   if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
                    #     set $year $1;
                    #     set $month $2;
                    #     set $day $3;
                    #     set $hour $4;
                    #   }
                    #
                    #   access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
                    @chainsaw = Chainsaw.create :separator  => @@pattern,
                                                :transforms => [:fixnum, nil, nil, :float],
                                                :ext        => ext
                end

                def collect
                    each_timeslot do |timestamp, stats|
                        statistic = Daemon::Model::Statistic.create :namespace => namespace,
                                                                    :timestamp => timestamp,
                                                                    :data      => stats
                        queue.enq statistic

                        logger.debug { %[#{name}: #{statistic.inspect}] }
                    end
                end

                def each_timeslot
                    count = nil
                    previous_timeslot = 0

                    LogFile.open(path, :mode => mode) do |io|
                        @chainsaw.cut(io) do |epoch, request, status, latency, upstream_latency, x_forwarded_for|
                            unless x_forwarded_for
                                logger.warn %[partial line read from "#{io.path}". skipping]
                                next
                            end

                            # normalize units to seconds with millisecond resolution
                            if @usec
                                latency = (latency / 1_000_000.0).round(3)
                                # upstream_latency = (upstream_latency / 1_000_000).round(3)
                            end

                            # normalize timestamp to request completion time
                            if @arrival
                                epoch += latency
                            end

                            timeslot = epoch.div(interval) * interval + interval
                            if timeslot > previous_timeslot   # e.g. nginx timestamps are not monotonic
                                if count
                                    stats = {
                                        'duration'          => interval,
                                        'latency_histogram' => xdigest.export(:round => 5),
                                        'http_counters'     => status_counters.to_h
                                    }

                                    yield previous_timeslot, stats
                                end

                                count = 0
                                xdigest.clear
                                status_counters.clear
                                previous_timeslot = timeslot
                            end

                            count += 1
                            xdigest.add latency
                            status_counters << status
                        end
                    end
                end
            end
        end
    end

Comments

Popular posts from this blog

AWS Elasticache Memcached connection

https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/accessing-elasticache.html#access-from-outside-aws http://hourlyapps.blogspot.com/2010/06/examples-of-memcached-commands.html Access memcached https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/GettingStarted.AuthorizeAccess.html Zip include hidden file https://stackoverflow.com/questions/12493206/zip-including-hidden-files phpmemcachedadmin ~ phpMyAdmin or phpPgAdmin ... telnet mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com 11211 stats items stats cachedump 27 100 https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/VPCs.EC.html https://lzone.de/cheat-sheet/memcached VPC ID Security Group ID (sg-...) Cluster: The identifier for the cluster memcached1 Creation Time: The time (UTC) when the cluster was created January 9, 2019 at 11:47:16 AM UTC+7 Configuration Endpoint: The configuration endpoint of the cluster memcached1.ahgofe.cfg.usw1.cache.amazonaws.com:11211 St...

Simulate Fail2ban on Apache request spam with mod_evasive limitipconn ...

https://en.wikipedia.org/wiki/Manchu_alphabet https://en.wikipedia.org/wiki/Sweet_potato https://en.wikipedia.org/wiki/New_World_crops https://www.mdpi.com/journal/energies http://www.cired.net/publications/cired2007/pdfs/CIRED2007_0342_paper.pdf https://www.davidpashley.com/articles/writing-robust-shell-scripts/ trap command https://en.wikipedia.org/wiki/Race_condition https://unix.stackexchange.com/questions/172541/why-does-exit-1-not-exit-the-script exit 1 not work it seem { } brace bound fixed it. cat access_log | cut -d ' ' -f 1 > ip1 sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4 | uniq -c | sort -n -r -s https://unix.stackexchange.com/questions/246104/unix-count-unique-ip-addresses-sort-them-by-most-frequent-and-also-sort-them https://stackoverflow.com/questions/20164696/how-to-block-spam-and-spam-bots-for-good-with-htaccess  Code: ------------------------------------------------------------------- #Block Spam Bots and Spam on your website #Block proxies...

Notes Windows 10 Virtualbox config, PHP Storm Japanese, custom PHP, Apache build, Postgresql

 cmd => Ctrl + Shift + Enter mklink "C:\Users\HauNT\Videos\host3" "C:\Windows\System32\drivers\etc\hosts" https://www.quora.com/How-to-create-a-router-in-php https://serverfault.com/questions/225155/virtualbox-how-to-set-up-networking-so-both-host-and-guest-can-access-internet 1 NAT + 1 host only config https://unix.stackexchange.com/questions/115464/how-to-properly-set-up-2-network-interfaces-in-centos-running-in-virtualbox DEVICE=eth0 TYPE=Ethernet #BOOTPROTO=dhcp BOOTPROTO=none #IPADDR=10.9.11.246 #PREFIX=24 #GATEWAY=10.9.11.1 #IPV4_FAILURE_FATAL=yes #HWADDR=08:00:27:CC:AC:AC ONBOOT=yes NAME="System eth0" [root@localhost www]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 # Advanced Micro Devices, Inc. [AMD] 79c970 [PCnet32 LANCE] DEVICE=eth1 IPADDR=192.168.56.28 <= no eff => auto like DHCP #GATEWAY=192.168.56.1 #BOOTPROTO=dhcp BOOTPROTO=static <= no eff ONBOOT=yes HWADDR=08:00:27:b4:20:10 [root@localhost www]# ...