Ad Widget

Collapse

Получение данных из http запроса

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • ka4a
    Member
    • Jul 2015
    • 68

    #1

    Получение данных из http запроса

    Добрый день коллеги.

    Появилась нужда в том чтобы вытаскивать количество запросов с сервера.
    Опишу задачу. Есть url https:/example.com/statistics/counter?key=12345678910&samples=1&offset=1 При таком запросе через браузер я получаю такие данные.
    {"counters":[{"sample":1,"timestamp":1436163840,"time":"2015-07-06T09:24:00+03:00","counter":44}]}

    Вот как бы мне всё это дело передавать в заббикс. Смотрю в сторону zabbix_sender по крону. И ещё момент значение timestamp меняется каждую минуту.

    Дополнительно скажу что данные эти храняться в Redis-Server. Смотрел в сети шаблон для редиса но там он мне не подходит.
  • sadman
    Senior Member
    • Dec 2010
    • 1611

    #2
    Насколько часто таскать данные-то надо?

    Comment

    • ka4a
      Member
      • Jul 2015
      • 68

      #3
      каждую минуту. я думал сделать скрипт и засунуть его в крон.

      Comment

      • rough-84
        Senior Member
        • Oct 2014
        • 198

        #4
        В винде таскаю данные со страницы через curl. Может и криво, но мне как то пок.
        Через userparametr выполняю запуск записи данных в txt.
        UserParameter=xz, C:\curl.exe -o C:\zabbix\xz.txt http://xzxzxz
        потом тащу в заббикс данные txt
        vfs.file.contents[c:\zabbix\xz.txt]

        Comment

        • sadman
          Senior Member
          • Dec 2010
          • 1611

          #5
          Code:
          #/bin/sh
          str='{"counters":[{"sample":1,"timestamp":1436163840,"time":"2015-07-06T09:24:00+03:00","counter":44}]}'
          echo $str | perl -n -e'/\"timestamp\"\:(\d+),.+\"counter\"\:(\d+)/ && print "$1 $2"'
          Итог:
          Code:
          ./test.sh
          1436163840 44
          Отсюда, руководствуясь примером из https://www.zabbix.com/documentation.../zabbix_sender

          Code:
          curl ... http://.... | perl -n -e'/\"timestamp\"\:(\d+),.+\"counter\"\:(\d+)/ && print "$1 $2"' | zabbix_sender -c /etc/zabbix/zabbix_agentd.conf -T -i -
          Дальше дергайте как хотите - хоть по system.run, хоть по cron.

          Comment

          • ka4a
            Member
            • Jul 2015
            • 68

            #6
            суть понятна

            Originally posted by sadman
            Насколько часто таскать данные-то надо?
            Суть понятна но! значения изменяются каждую минуту. Тоесть выше описаный скрипт не подойдет. нужно делать запрос либо на https либо в redis чтобы получить актуальные данные.

            Comment

            • sadman
              Senior Member
              • Dec 2010
              • 1611

              #7
              Как я понимаю - вы пост наполовину только читаете?

              Comment

              • ka4a
                Member
                • Jul 2015
                • 68

                #8
                Не до конца понимаю логику.

                Исходя из вашего совета делаю

                curl https:/example.com/statistics/counter?key=12345678910&samples=1&offset=1 | perl -n -e'/\"timestamp\"\\d+),.+\"counter\"\\d+)/ && print "$1 $2"' | zabbix_sender -c /etc/zabbix/zabbix_agentd.conf -T -i -
                вижу обычный вывод значения. вопрос к чему эта строка zabbix_sender -c /etc/zabbix/zabbix_agentd.conf -T -i - тут должен быть файл, какой?

                Comment

                • sadman
                  Senior Member
                  • Dec 2010
                  • 1611

                  #9
                  По ссылке на документацию zabbix_sender:

                  Code:
                  echo - hw.serial.number 1287872261 SQ4321ASDF | zabbix_sender -c /usr/local/etc/zabbix_agentd.conf -T -i -
                  Отправка значения с штампом времени, полученным из командной строки, на Zabbix сервер, указанный в конфигурационном файле демона агента. Тире в данных, подаваемых на стандартный ввод, указывает, что имя узла сети должно быть взято из того же конфигурационного файла.
                  не добавил я в print имя ключа c тире, правда. Думал, что в документацию-то сходите.

                  Comment

                  • ka4a
                    Member
                    • Jul 2015
                    • 68

                    #10
                    Прошу сильно не пинать. Я сделал файл допустим 1.sh

                    вот его содержимое

                    PHP Code:
                    |#!/bin/sh

                    curl https://some-host.com/statistics/counter?key=54b33839-793f-bdf2-f52e-4810453c9022&samples=1&offset=1&for_key=avia_search | perl -n -e'/\"timestamp\"\:(\d+),.+\"counter\"\:(\d+)/ && print "$1 $2"' - | zabbix_sender -c /etc/zabbix/zabbix_agentd.conf -T -i - 
                    Делаю ./1.sh

                    Вижу

                    PHP Code:
                    {"counters":[{"sample":0,"timestamp":1436271360,"time":"2015-07-07T15:16:00+03:00","counter":26},{"sample":1,"timestamp":1436271300,"time":"2015-07-07T15:15:00+03:00","counter":56},{"sample":2,"timestamp":1436271240,"time":"2015-07-07T15:14:00+03:00","counter":46},{"sample":3,"timestamp":1436271180,"time":"2015-07-07T15:13:00+03:00","counter":46},{"sample":4,"timestamp":1436271120,"time":"2015-07-07T15:12:00+03:00","counter":33},{"sample":5,"timestamp":1436271060,"time":"2015-07-07T15:11:00+03:00","counter":52},{"sample":6,"timestamp":1436271000,"time":"2015-07-07T15:10:00+03:00","counter":58},{"sample":7,"timestamp":1436270940,"time":"2015-07-07T15:09:00+03:00","counter":76},{"sample":8,"timestamp":1436270880,"time":"2015-07-07T15:08:00+03:00","counter":41},{"sample":9,"timestamp":1436270820,"time":"2015-07-07T15:07:00+03:00","counter":39}]} 

                    Comment

                    • sadman
                      Senior Member
                      • Dec 2010
                      • 1611

                      #11
                      Редиса у меня вашего нет, поэтому делаю так:

                      Code:
                      curl -s http://api.openweathermap.org/data/2.5/weather?q=London,uk | perl -n -e'/\"humidity\"\:(\d+),.+\"dt\"\:(\d+)/ && print " - london.humidity $2 $1"'
                      
                       - london.humidity 1436270537 60
                      Теперь внимательно смотрим на пример из документации на zabbix_sender:

                      Code:
                      echo - hw.serial.number 1287872261 SQ4321ASDF | zabbix_sender -c /usr/local/etc/zabbix_agentd.conf -T -i -
                      "- hw.serial.number 1287872261 SQ4321ASDF" похоже по формату на "- london.humidity 1436270537 60" ? Если похоже, то скармливайте его zabbix_sender'у ровно по примеру.

                      Но хочу предостеречь: судя по последнему сообщению вы получаете не просто объект JSON, как можно было предполагать из первого сообщения, а массив объектов. И как будут перемешаны элементы массива - мне неизвестно. К тому же - ключи JSON могут сортироваться в зависимости от сериализатора и желания разработчика. Следовательно - вы можете на определенном этапе начать получать погоду на Марсе вместо нужного counter. Поэтому вам надо определиться - что может отдаваться ссылке, что вам нужно получить и не проще ли воспользоваться чем-то типа redis-cli. Если не проще, то пора разучивать JSON:XS.

                      Comment

                      • ka4a
                        Member
                        • Jul 2015
                        • 68

                        #12
                        из redis-cli не могу выдернуть потому что значение timestamp меняется каждую минуту. И тут при запросе мне нужно получать timestamp, time, counter.

                        Далее эти значения нужно выводить в заббикс в графики. Вообще если вам будет удобно давайте свяжемся по скайпу!

                        Comment

                        • sadman
                          Senior Member
                          • Dec 2010
                          • 1611

                          #13
                          Вообще, конечно, логично, что timestamp меняется. Как ему не меняться - он же timestamp.

                          Time я не знаю, зачем пихать в заббикс - это тот же самый timestamp, только на человечьем.

                          Два параметра вам нужно отослать заббиксу - таймштамп и значение counter. Дальше он сам пилу нарисует, какую нужно.

                          Вопрос только в том - как вы справитесь с JSON )) А для этого необходимо для себя решить - что там за семплы 0..7 и какой из них правильный.

                          Comment

                          • ka4a
                            Member
                            • Jul 2015
                            • 68

                            #14
                            Задача облегчается на лету.

                            Вместо json теперь можно запрашивать 1 число:

                            /statistics/counter_value?key=12345678910

                            samples=1 и offset=1 передавать в этом запросе не нужно.

                            Т.е. Если я делаю сейчас запрос http://example.com/statistics/counte...ey=12345678910

                            Я получаю ответ 10. По идее задача стала легче.

                            Comment

                            • sadman
                              Senior Member
                              • Dec 2010
                              • 1611

                              #15
                              Ну, тогда вообще не должно быть никаких затруднений
                              Code:
                              UserParameter=redis.stat[*], curl -s http://example.com/statistics/counter_value?key=$1
                              В заббиксе ключ айтема: redis.stat[12345678910].

                              Comment

                              Working...