Оновлення timezone в logstash

Всім привіт! Вже як пару місяців наша компанія успішно використовує в продакшені зв'язку logstash-elasticsearch-kibana для збору і обробки досить великого обсягу логів. Заглянувши в kibana після переведення годинників виявилося, що всі логи йдуть з відставанням по часу в 1 годину. Під катом хочу поділитися вирішенням проблеми з timezones у зв'язці logstash-elasticsearch-kibana і готової складанням logstash з оновленими timezones.

Не буду особливо вникати, як вплинула зміна timezone на кінцевий вигляд логів, але за фактом у kibana ми отримували подія створене в поточний момент часу як події годиною раніше. Вийшла досить забавна картина, враховуючи, що не всі rsyslogd перезапустились автоматом і підхопили нові timezone, пара серверів продовжували працювати за старими часовим поясам.

Вирішити проблему можна звичайно костыльной налаштуванням logstash, але я вирішив повноцінно оновити timezone в logstash.


На рис. графік кол-ва подій у момент переходу на logstash з коректними timezones.
У Logstash можливі відразу три джерела тимчасових зон — одна в java, друга в геме ruby tzinfo, третя закомпилированна jruby (артефакт joda-time і joda-timezones).

  1. Почнемо з простого — оновимо tzdata в java:

    Для цього скористаємося утилітою від Oracle tzupdater, можна завантажити з сайту Oracle.

    Оновлення відбувається буквально в одну команду:

    java-jar tzupdater.jar -V
    tzupdater version 1.4.7-b01
    JRE time zone data version: tzdata2014c
    Embedded time zone data version: tzdata2014g
    java-jar tzupdater.jar -u
    java-jar tzupdater.jar -V
    tzupdater version 1.4.7-b01
    JRE time zone data version: tzdata2014g
    Embedded time zone data version: tzdata2014g
    
  2. Збірка jruby з новою tzdata:

    1. Для початку зберемо артефакт joda-time з новими timezones:
      Перед складанням встановимо пакети maven і ant:
      apt-get install maven ant 
      Завантажуємо останній доступний пакет joda-timezones, замінюємо в ньому версію tzdata і в залежностях вказуємо більш свіжий joda-time(2.5 від 3.10.2014):
      mkdir joda-time
      cd joda-time
      wget http://search.maven.org/remotecontent?filepath=org/jruby/joda-timezones/2013d/joda-timezones-2013d.pom -O pom.xml
      sed-i 's/2013d/2014g/' pom.xml
      sed-i 's/<version>2.2/<version>2.5/' pom.xml
      package mvn
      mvn instal
      
      Тепер, maven отримав актуальну версію joda-timezones.
    2. Завантажуємо исходники версії jruby, яка використовується в logstash (для logstash 1.4 jruby-1.7.11):
      wget https://github.com/jruby/jruby/archive/1.7.11.tar.gz
      tar-xvf 1.7.11.tar.gz
      cd jruby-1.7.11/
      
      Замінюємо версію артефакту в ./core/pom.xml:
      sed-i 's/<tzdata.version>2013d/<tzdata.version>2014g/' ./core/pom.xml
      sed-i 's/<tzdata.jar.version>2013d/<tzdata.jar.version>2014g/' ./core/pom.xml
      
      . /pom.xml:
      sed-i 's/<joda.time.version>2.3/<joda.time.version>2.5/' ./pom.xml
      
      Збираємо jruby:
      ~/jruby-1.7.11# mvn-Pcomplete
      
      Після складання перевіримо яку версію tz відповість jruby, заодно порівняємо час з реальним (в кінці я запускаю http server, що б було зручніше збирати logstash):
      ~/jruby-1.7.11# java-jar ./maven/jruby-complete/target/jruby-complete-1.7.11.jar -rrbconfig-e 'p RbConfig::CONFIG["tzdata.version"]'
      "2014g"
      ~/jruby-1.7.11# java-jar ./maven/jruby-complete/target/jruby-complete-1.7.11.jar -e 'p Time.now'
      2014-10-29 14:58:07 +0500
      ~/jruby-1.7.11# cd ./maven/jruby-complete/target/;python-m SimpleHTTPServer
      

  3. Збираємо logstash:

    Викачуємо розпаковуємо:
    wget https://github.com/elasticsearch/logstash/archive/v1.4.2.tar.gz
    tar-xvf v1.4.2.tar.gz
    mv logstash-1.4.2 logstash-contrib;cd logstash-contrib
    
    Вносимо зміни:
    diff --git a/Makefile b/Makefile
    index 0ec3da1..7fcca1a 100644
    --- a/Makefile
    +++ b/Makefile
    @@ -7,7 +7,7 @@ ELASTICSEARCH_VERSION=1.1.1
    
    WITH_JRUBY=java-jar $(shell pwd)/$(JRUBY) -S
    JRUBY=vendor/jar/jruby-complete-$(JRUBY_VERSION).jar
    -JRUBY_URL=http://jruby.org.s3.amazonaws.com/downloads/$(JRUBY_VERSION)/jruby-complete-$(JRUBY_VERSION).jar
    +JRUBY_URL=http://127.0.0.1:8000/jruby-complete-$(JRUBY_VERSION).jar
    JRUBY_CMD=bin/logstash env java-jar $(JRUBY)
    
    ELASTICSEARCH_URL=http://download.elasticsearch.org/elasticsearch/elasticsearch
    diff --git a/logstash.gemspec b/logstash.gemspec
    index 4917d83..6ba8ae4 100644
    --- a/logstash.gemspec
    +++ b/logstash.gemspec
    @@ -23,6 +23,7 @@ Gem::Specification.new do |gem|
    gem.add_runtime_dependency "stud" #(Apache license 2.0)
    gem.add_runtime_dependency "clamp" # for command line args/flags (MIT license)
    gem.add_runtime_dependency "i18n", [">=0.6.6"] #(MIT license)
    + gem.add_runtime_dependency "tzinfo", [">=1.2.2"]#(MIT license)
    
    # Web dependencies
    gem.add_runtime_dependency "ftw", ["~> 0.0.39"] #(Apache license 2.0)
    diff --git a/tools/Gemfile.jruby-1.9.lock b/tools/Gemfile.jruby-1.9.lock
    index dc11fd5..41e4362 100644
    --- a/tools/Gemfile.jruby-1.9.lock
    +++ b/tools/Gemfile.jruby-1.9.lock
    @@ -169,7 +165,7 @@ GEM
    http_parser.rb (~> 0.5.0)
    json (~> 1.8)
    simple_oauth (~> 0.2.0)
    - tzinfo (1.1.0)
    + tzinfo (1.2.2)
    thread_safe (~> 0.1)
    user_agent_parser (2.1.2)
    uuidtools (2.1.4)
    

    І запускаємо складання:
    make tarball
    

    По завершенню збирання отримаємо ./build/logstash-1.4.2.tar.gz — готовий logstash з оновленою tzdata!


P.S. Всі маніпуляції проводилися на ubuntu 14.04 з встановленою Oracle Java(TM) Development Kit (JDK) 7 (build 1.7.0_72-b14)

Готову збірку logstash 1.4.3 з оновленими timezone можна скачати c yandex-disk або mail.ru.



Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.