logsta sh - анализирует числа и конвертирует единицы хранения в журналах, используя Ruby FIlter - PullRequest
0 голосов
/ 07 февраля 2020

Извлечение ЧИСЛА из журналов и преобразование единиц хранения.

Примеры журналов -

2020-02-04 16: 18: 56,783 ИНФОРМАЦИЯ Log4jFactory $ Log4jLogger [10.xxx.xxx.xxx]: 5701 [Dry -PROD-XC6] [ 3.7.6] Получено подтверждение от соединения [id = 26876, /10.xxx.xxx.xxx:5701->/10.xxx.xxx.xxx:56584, конечная точка = ноль, живая = истина, тип = CSHARP_CLIENT], успешно аутентифицировано, принципал: ClientPrincipal {uuid = 'd7d8b718-ed75-4cc3-b51a-c620bb082255', ownerUuid = '058720ad-7b35-40f6-8978-bd9cf7e286e c'}, подключение владельца: true, версия клиента: null * 100

2020-02-04 16: 15: 27,519 ИНФОРМАЦИЯ Log4jFactory $ Log4jLogger [10.xxx.xxx.xxx]: 5701 [Dry -PROD-XC6] [3.7.6] процессоров = 8, физическая память. итого = 31,4 ГБ, Physical.memory.free = 18,8 ГБ, swap.space.total = 7,8 ГБ, swap.space.free = 7,8 ГБ, heap.memory.used = 4,5 ГБ, heap.memory.free = 536,5 МБ, heap.memory.total = 5,0 г, heap.memory.max = 5,0 г, heap.memory.used / total = 89,51%, heap.memory.used / max = 89,51%, native.memory.used = 8,2 млн, собственный .memory.free = 3,5G, native.memory.total = 64,0M, native.memory.max = 3,5G, native.meta.memory.used = 80,0M, native .meta.memory.free = 432,0M, native.meta.memory.percentage = 90,75%, несовершеннолетний.g c .count = 18605, несовершеннолетний.g c .time = 121136ms, Major.g c. count = 0, major.g c .time = 0 мс, load.process = 0,00%, load.system = 0,01%, load.systemAverage = 1,00%, thread.count = 69, thread.peakCount = 229, кластер. timeDiff = 4083, event.q.size = 0, executor.q.asyn c .size = 0, executor.q.client.size = 0, executor.q.query.size = 0, executor.q.scheduled .size = 0, executor.q.io.size = 0, executor.q.system.size = 0, executor.q.operations.size = 0, executor.q.priorityOperation.size = 0, operations.completed.count = 351751533, executor.q.mapLoad.size = 0, executor.q.mapLoadAllKeys.size = 0, executor.q.cluster.size = 0, executor.q.response.size = 0, operations.running.count = 0 , operations.pending.invocations.percentage = 0,00%, operations.pending.invocations.count = 1, proxy.count = 0, clientEndpoint.count = 231, connection.active.count = 232, client.connection.count = 231, connection.count = 1

Попытка извлечь НОМЕР для полей Памяти (как родной. memory.used = 8.2M, native.memory.free = 3.5G, native.memory.total = 64.0M, native.memory.max = 3.5G) и конвертировать единицы с использованием фильтра Ruby.

Сначала использовал Logsta sh KV Filter для получения пар KV, затем пробовал следующий код (я новичок в Ruby Coding)

my Ruby Code -

               ruby {
                        code => '
                        event.to_hash.keys.each { |k,v|
                        matches = v.scan(/(\d*\.\d*?i)([KMG])$/)
                    if matches[2] == nil
                        event.set(k,event.get(v))
                    elsif matches[2] == "K"
                        multiplyBy = 1024
                        event.set(k, matches[1].to_f * multiplyBy)
                    elsif matches[2] == "M"
                        multiplyBy = 1024 * 1024
                        event.set(k, matches[1].to_f * multiplyBy)
                    elsif matches[2] == "G"
                        multiplyBy = 1024 * 1024 * 1024
                        event.set(k, matches[1].to_f * multiplyBy)
                    else
                        event.set(k, event.get(v))
                    end
                }
    '
}

Просмотр ошибок в журналах -

[2020-02-11T17: 01: 09,603] [ОШИБКА] [logsta sh .filters. ruby] [main] Ruby произошло исключение: неопределенный метод `scan 'для nil: NilClass

благодарен за любую помощь или руководство. Спасибо

1 Ответ

0 голосов
/ 08 февраля 2020

Regex сделает трюк:

Если вы хотите сопоставить единицу измерения:

\d*?\.\d*?(M|G)

Если вы просто хотите сопоставить число (целое или десятичное):

\d*?(\.)\d*

\d обозначает цифры

* обозначает x раз

? используется здесь, чтобы не быть жадным (минимизировать усилие синтаксического анализатора) после опции * (хорошая практика)

( | ) означает ИЛИ и установить опцию между 2 символами M или G ( это может варьироваться в зависимости от языка, на котором выполняется синтаксический анализатор

Если у вас есть какие-либо сомнения, вы можете проверить регулярное выражение здесь .

Вы можете оптимизировать свое регулярное выражение, если вы управляете количеством десятичных знаков, используя {}, и добавьте необязательно ., если вы не уверены, что у вас всегда будут десятичные дроби.

Насколько я помню, у вас есть опция в logsta sh, чтобы анализировать с помощью регулярных выражений и правильно выводить ее с помощью grok или встроенного фильтра и выводить ее напрямую, как вы хотите.

...