[Elasticsearch] Terms + Sub Sum Aggs 사례.

Elastic/Elasticsearch 2022. 3. 24. 18:13

문제)

하루 동안 데이터 요청을 가장 많이한 IP Top 5 를 구하시오.

 

해결)

GET /kibana_sample_data_logs/_search
{
  "size":0,
  "aggs": {
    "ip_aggs": {
      "terms": {
        "field": "ip"
      },
      "aggs": {
        "sum_aggs": {
          "sum": {
            "field": "bytes"
          }
        },
        "sum_aggs_sort": {
          "bucket_sort": {
            "sort": [
              { "sum_aggs": { "order": "desc" } } 
            ],
            "size": 5
          }
        }
      }
    }
  }
}

 

관련 문서)

https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-bucket-terms-aggregation.html

https://www.elastic.co/guide/en/elasticsearch/reference/8.1/search-aggregations-pipeline-bucket-sort-aggregation.html

 

Elasticsearch 를 설치 하고 Kibana 를 이용해서 Sample Data 를 이용하였습니다.

그냥 Single node 로 구성 해서 테스트 해보실 수 있습니다.

:

[Docker] apk not found 또는 certificate verify failed:ssl 발생 시.

Cloud&Container/IaC 2022. 3. 24. 11:33

아래와 같은 에러 발생 시

Step 8/13 : RUN apk add tzdata
 ---> Running in 7d1593d1239f
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
140460674784072:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1914:
ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.14/main: Permission denied
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.14/main: No such file or directory
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
140460674784072:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1914:
ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.14/community: Permission denied
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.14/community: No such file or directory
ERROR: unable to select packages:
  tzdata (no such package):
    required by: world[tzdata]
The command '/bin/sh -c apk add tzdata' returned a non-zero code: 1

제가 사용했던 이미지는 OpenJDK 11 Alpine 입니다.

FROM adoptopenjdk/openjdk11:alpine

Timezone 설정을 위해서 

RUN apk add tzdata

를 Dockerfile 에 추가 했는데 에러가 발생을 했습니다.

 

찾아 보니 SSL 인증서 문제라고 해서 아래와 같이 수정 했습니다.

RUN sed 's/https/http/g' -i /etc/apk/repositories
RUN apk update
RUN apk add --no-cache bash
RUN apk add tzdata

나중에 또 기억 못할 것 같아서 기록 합니다.

:

[Docker] Spring Boot App 도커 적용

ITWeb/개발일반 2022. 3. 23. 10:49

Springboot 로 WAS 생성 후 이를 도커 기반으로 생성, 실행 하기 위해서 관련 내용 기록 합니다.

 

관련 문서)

https://spring.io/guides/gs/spring-boot-docker/
https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/

 

과정)

1. 프로젝트를 빌드 해서 bootJar 를 생성 합니다.

보통 build/libs 에 생성이 됩니다.

 

2. Dockerfile 을 생성 합니다.

여기서 bootJar 를 ADD 해야 하는데 Dockerfile 과 같은 Depth 에 위치 하거나 하위에 위치해야 합니다.

상위에 bootJar 가 있을 경우 permission denied 에러가 발생 합니다.

 

3. Image 생성을 합니다.

$ docker build -t 이미지명:태그 .

태그 정보는 jenkins 에서 build number 를 부여 하거나 운영 규칙을 정해서 관리 합니다.

registry 를 운영하고 있으면 생성된 이미지를 등록 합니다.

 

4. docker-compose.yml 을 생성 합니다.

registry 를 운영하고 있으면 registry 에서 이미지를 받아 옵니다.

 

관련 예제 코드들은 위 문서에 잘 나와 있으니 참고 하면 됩니다.

 

아래는 그냥 참고용으로 올려 봅니다.

build.gradle)
...중략...
bootJar {
  destinationDirectory=file('docker/libs')
  enabled = true
}
...중략...

$ export TAG=1.0.0
$ docker build -t boot-app:$TAG .


Case 1) docker/Dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=./libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Case 2) docker/Dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=./libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT java \
-jar app.jar

Case 3) docker/Dockerfile
ENV heapSize="-Xms2048 -Xmx2048m"
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=./libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","${heapSize}","-jar","/app.jar"]

Case 4) docker/Dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=./libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT java \
${heapSize} \
-jar app.jar

ENTRYPOINT 추가 옵션)
-Djava.security.egd=file:/dev/./urandom \
-Dspring.profiles.active=local


docker-compose) docker/docker-compose.yml
version: '3.7'

services:
  boot-app:
    container_name: boot-app
    image: boot-app:${TAG}
    environment:
      - TZ=Asia/Seoul
      - env=local
      - "heapSize=-Xms2048m -Xmx2048m"
    ports:
      - "8080:8080"
    volumes:
      - ./logs:/home/appuser/logs
    sysctls:
      - net.core.somaxconn=65000
    restart: on-failure

 

:

[Elasticsearch] 8.0 살펴 봤던 거

Elastic/Elasticsearch 2022. 3. 23. 10:04

시간이 없어서 전체적으로 다 살펴 보지는 못했네요.

우선 확인 한것만 그냥 올려 놓습니다.

 

Elasticsearch 8.0 

- path.data 다중 설정이 deprecated.
7.13.0 부터 deprecated 되었으나 아직까지는 기능을 제공 하고 있음.
디스크를 추가 하기 보다 data node 를 늘리는 것을 추천함.
단일 경로 설정 사용을 권장함.

- system index 에 접근 제어.
allow_restricted_indices: true 로 하면 접근 가능함.

- 8.0 실행 시 jdk 17 을 요구함.
warning: ignoring JAVA_HOME=/Users/henry/.jenv/versions/11.0; using ES_JAVA_HOME
The minimum required Java version is 17; your Java version from [/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home] does not meet this requirement

https://adoptium.net/ 에서 다운로드 받아 설치 합니다. (pkg)

/Library/Java/JavaVirtualMachines/temurin-17.jdk
$ jenv add /Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
$ ES_JAVA_HOME='/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home' bin/elasticsearch

- 8.0 부터는 보안이 기본 적용 됩니다.
관련 security 기능을 사용하고 싶지 않을 경우 xpack.security.enable: false 로 설정 하면 됩니다.


✅ Elasticsearch security features have been automatically configured!
✅ Authentication is enabled and cluster connections are encrypted.

ℹ️  Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
  5mZOrRjTURT=V90LqU5N

ℹ️  HTTP CA certificate SHA-256 fingerprint:
  24d263ef19a4e66de19ab35dbd8a0cbf4ca303598123d3ee6acbb96852e25421

ℹ️  Configure Kibana to use this cluster:
• Run Kibana and click the configuration link in the terminal when Kibana starts.
• Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30 minutes):
  eyJ2ZXIiOiI4LjAuMCIsImFkciI6WyIxOTIuMTY4LjAuMTA0OjkyMDAiXSwiZmdyIjoiMjRkMjYzZWYxOWE0ZTY2ZGUxOWFiMzVkYmQ4YTBjYmY0Y2EzMDM1OTgxMjNkM2VlNmFjYmI5Njg1MmUyNTQyMSIsImtleSI6Imd0R2g1bjRCc3hnWEYtbV92bU43OnlwVDhOaXNaU2ZXejRhdEhTaExfS0EifQ==

ℹ️  Configure other nodes to join this cluster:
• On this node:
  ⁃ Create an enrollment token with `bin/elasticsearch-create-enrollment-token -s node`.
  ⁃ Uncomment the transport.host setting at the end of config/elasticsearch.yml.
  ⁃ Restart Elasticsearch.
• On other nodes:
  ⁃ Start Elasticsearch with `bin/elasticsearch --enrollment-token <token>`, using the enrollment token that you generated.


- elasticsearch.yml 내부에 환경 변수 설정이 가능 합니다.
node.name:    ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}

export HOSTNAME="host1,host2"

- transient 설정을 더 이상 추천 하지 않습니다.
영구 설정을 사용 하세요.

- data directory 에 대한 어떠한 조작, 수정도 하지 마십시오.


- lucene-analyzers-common 이 lucene 9.0.0 으로 넘어 가면서 lucene-analysis-common 으로 변경 되었습니다.
import org.apache.lucene.analysis.util.TokenizerFactory;
to
import org.apache.lucene.analysis.TokenizerFactory;
로 변경 되었습니다.

import org.apache.lucene.analysis.standard.ClassicFilter;
to
import org.apache.lucene.analysis.classic.ClassicFilter;
로 변경 되었습니다.

- node 단독 실행 시 아래 설정이 꼭 되어야 합니다.
discovery.type: single-node
or
cluster.initial_master_nodes, discovery.seed_hosts, discovery.seed_providers 중 하나는 꼭 설정 되어야 합니다.

- mapping 파라미터 중 boost 파라미터가 삭제 되었습니다.
.The `boost` parameter on field mappings has been deprecated
.The `boost` parameter on field mappings has been removed

- jdk 변경 된 점
Remove support for JAVA_HOME
Require Java 17 for running Elasticsearch

- exist action some removed.
Remove aliases exist action
Remove indices exists action
Remove types exists action

- Enable LZ4 transport compression by default

:

[Logback] JsonLayout, PatternLayout

ITWeb/개발일반 2022. 3. 16. 15:52
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
        <timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
        <appendLineSeparator>true</appendLineSeparator>
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
          <prettyPrint>true</prettyPrint>
        </jsonFormatter>
      </layout>
    </encoder>
  </appender>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
    </layout>
  </appender>
  
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/file.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>logs/file-%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>

    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</timestampFormat>
        <timestampFormatTimezoneId>Asia/Seoul</timestampFormatTimezoneId>
        <appendLineSeparator>true</appendLineSeparator>
        <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
          <prettyPrint>true</prettyPrint>
        </jsonFormatter>
      </layout>
    </encoder>
  </appender>
  
  ...중략...
  
  </configuration>

필요한 부분에 대해서만 기록해 봅니다. 

appender !!

 

: