Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Gatling : выполнить запись логов в базу postgres

load
gatling
java
Теги: #<Tag:0x00007fedc07bcbf8> #<Tag:0x00007fedc07bc9a0> #<Tag:0x00007fedc07bc810>

(Ramon Menezes) #1

Добрый день,
начал разбиратся с Gatling, тул интересный, гибкий и мощный. Сейчас возникла проблемма с которой сижу уже 3й день.
задача: необходимо перенаправить запись логов в бд
то что сделал:
0, java + maven + gatling plugin + gatling-core + gatling-chart + gatling-jdbc + gatling-http

  1. бд - postgres
  2. gatling.conf
    data {
    jdbc {
    db {
    url = “jdbc:postgresql…”
    username = “login”
    password = “pass”
    }
  3. logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>false</resetJUL>
    </contextListener>
    <appender name="jdbc" class="ch.qos.logback.classic.db.DBAppender">
           <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
            <driverClass>org.postgresql.Driver</driverClass>
            <url>jdbc:postgresql://192.168.99.100:5432/pgdb</url>
            <user>pguser</user>
            <password>pguser</password>
            <sqlDialect class="ch.qos.logback.core.db.dialect.PostgreSQLDialect"/>
            <param name="dialect" value="POSTGRES_DIALECT" />
        </connectionSource>
         <sqlDialect class="ch.qos.logback.core.db.dialect.PostgreSQLDialect"/>`
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern>
            <immediateFlush>false</immediateFlush>
        </encoder>
    </appender>
       <root level="INFO">
        <appender-ref ref="jdbc"/>
    </root>
</configuration>

на сколько понимаю в режиме нормальной работы gatling при подключении к бд сам создает таблички и бросает туда данные.
по состояни на сейчас таблички не создаются
подскажите что я упустил.


(Ramon Menezes) #2

немного поковырявшись с настройками удалось получить такое

14:03:39,484 |-ERROR in ch.qos.logback.classic.db.DBAppender[jdbc] - problem appending event org.postgresql.util.PSQLException: ERROR: relation "logging_event" does not exist
  ╧ючшЎш : 13
        at org.postgresql.util.PSQLException: ERROR: relation "logging_event" does not exist
  ╧ючшЎш : 13
        at      at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
        at      at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
        at      at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
        at      at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
        at      at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
        at      at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
        at      at ch.qos.logback.classic.db.DBAppender.subAppend(DBAppender.java:104)
        at      at ch.qos.logback.classic.db.DBAppender.subAppend(DBAppender.java:43)
        at      at ch.qos.logback.core.db.DBAppenderBase.append(DBAppenderBase.java:105)
        at      at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84)
        at      at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)
        at      at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)
        at      at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)
        at      at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421)
        at      at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
        at      at ch.qos.logback.classic.Logger.info(Logger.java:579)
        at      at io.gatling.core.stats.writer.DataWriter$$anonfun$1.applyOrElse(DataWriter.scala:44)
        at      at io.gatling.core.stats.writer.DataWriter$$anonfun$1.applyOrElse(DataWriter.scala:42)
        at      at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:34)
        at      at akka.actor.FSM.processEvent(FSM.scala:665)
        at      at akka.actor.FSM.processEvent$(FSM.scala:662)
        at      at io.gatling.core.stats.writer.DataWriter.processEvent(DataWriter.scala:28)
        at      at akka.actor.FSM.akka$actor$FSM$$processMsg(FSM.scala:659)
        at      at akka.actor.FSM$$anonfun$receive$1.applyOrElse(FSM.scala:653)
        at      at akka.actor.Actor.aroundReceive(Actor.scala:514)
        at      at akka.actor.Actor.aroundReceive$(Actor.scala:512)
        at      at io.gatling.core.akka.BaseActor.aroundReceive(BaseActor.scala:23)
        at      at akka.actor.ActorCell.receiveMessage(ActorCell.scala:527)
        at      at akka.actor.ActorCell.invoke(ActorCell.scala:496)
        at      at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)
        at      at akka.dispatch.Mailbox.run(Mailbox.scala:224)
        at      at akka.dispatch.Mailbox.exec(Mailbox.scala:234)
        at      at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at      at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at      at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at      at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

осталось понять что такое “logging_event”, откуда оно береться и почему оно пустое


(Ruslan Semerenko) #3

gatling тут ни при чем. Вы хотите писать логи в базу, используя логгер logback, а именно его DBAppender.
Документация тут https://logback.qos.ch/manual/appenders.html
Там написано:

These three tables are logging_event, logging_event_property and logging_event_exception. They must exist before DBAppender can be used.


(Ruslan Semerenko) #4

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


(Ramon Menezes) #5

за это спасибо, сазу не подумал )
по поводу логов, с логбеком разобрался, по нему есть много документации, Но при использовании логбека он не бросает в базу ничего полезного (лично для меня). в базе присутствуют данные по каждому запросу (реквест, респонс, параметры итд ) и больше ничего полезного, ни времени выполнения ни к примеру колличество актвных пользователей… изначально насторожило следующее. В Gatling есть следующие строчки в конфигах

jdbc {
      db {
        #url = "jdbc:mysql://localhost:3306/temp" # The JDBC URL used by the JDBC DataWriter
        #username = "root"                        # The database user used by the JDBC DataWriter
        #password = "123123q"                     # The password for the specified user
      }
      #bufferSize = 20                            # The size for each batch of SQL inserts to send to the database
      create {
        #createRunRecordTable = "CREATE TABLE IF NOT EXISTS `RunRecords` ( `id` INT NOT NULL AUTO_INCREMENT , `runDate` DATETIME NULL , `simulationId` VARCHAR(45) NULL , `runDescription` VARCHAR(45) NULL , PRIMARY KEY (`id`) )"
        #createRequestRecordTable = "CREATE TABLE IF NOT EXISTS `RequestRecords` (`id` int(11) NOT NULL AUTO_INCREMENT, `runId` int DEFAULT NULL, `scenario` varchar(45) DEFAULT NULL, `userId` VARCHAR(30) NULL, `name` varchar(50) DEFAULT NULL, `requestStartDate` bigint DEFAULT NULL, `requestEndDate` bigint DEFAULT NULL, `responseStartDate` bigint DEFAULT NULL, `responseEndDate` bigint DEFAULT NULL, `status` varchar(2) DEFAULT NULL, `message` varchar(4500) DEFAULT NULL, `responseTime` bigint DEFAULT NULL, PRIMARY KEY (`id`) )"
        #createScenarioRecordTable = "CREATE TABLE IF NOT EXISTS `ScenarioRecords` (`id` int(11) NOT NULL AUTO_INCREMENT, `runId` int DEFAULT NULL, `scenarioName` varchar(45) DEFAULT NULL, `userId` VARCHAR(30) NULL, `event` varchar(50) DEFAULT NULL, `startDate` bigint DEFAULT NULL, `endDate` bigint DEFAULT NULL, PRIMARY KEY (`id`) )"
        #createGroupRecordTable = "CREATE TABLE IF NOT EXISTS `GroupRecords` (`id` int(11) NOT NULL AUTO_INCREMENT, `runId` int DEFAULT NULL, `scenarioName` varchar(45) DEFAULT NULL, `userId` VARCHAR(30) NULL, `entryDate` bigint DEFAULT NULL, `exitDate` bigint DEFAULT NULL, `status` varchar(2) DEFAULT NULL, PRIMARY KEY (`id`) )"
      }
      insert {
        #insertRunRecord = "INSERT INTO RunRecords (runDate, simulationId, runDescription) VALUES (?,?,?)"
        #insertRequestRecord = "INSERT INTO RequestRecords (runId, scenario, userId, name, requestStartDate, requestEndDate, responseStartDate, responseEndDate, status, message, responseTime) VALUES (?,?,?,?,?,?,?,?,?,?,?)"
        #insertScenarioRecord = "INSERT INTO ScenarioRecords (runId, scenarioName, userId, event, startDate, endDate) VALUES (?,?,?,?,?,?)"
        #insertGroupRecord = "INSERT INTO GroupRecords (runId, scenarioName, userId, entryDate, exitDate, status) VALUES (?,?,?,?,?,?)"
      }
    }

описание этого в документации не нашел, но судя по скриптах это похоже на сохранение деталных логов в бд. вот эту штуку хотелось бы настроить


(Ruslan Semerenko) #6

описание этого в документации не нашел

Этот функционал был удален в версии 2.2. Видимо как раз из-за проблем с влиянием на производительность.


(Ramon Menezes) #7

спасибо, а то я уже начал думать что у меня с руками проблемы))