ELK Stack - Openstack API 실습

변재한·2023년 4월 22일
0
post-thumbnail

연구실 프로젝트를 수행하며 Openstack상에서 metric을 수집하여 이용할지 말지 고민하고 있던 찰나에,
일단 간략하게라도 사용해보기로 결정해서 ELK Stack을 써보았다.

개발 환경

  • Ubuntu 20.04 Server
  • devstack으로 Xena버전 Openstack 구축

사전 인스턴스 구축 상황 in Openstack


1. ELK Stack


ElasticSearch 설치


# openjdk 8버전 설치하기
sudo apt-get install openjdk-8-jdk -y

# java 환경설정
vi /etc/profile 후
아래 내용 추가
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export Class_PATH=$JAVA_HOME/lib:$CLASS_PATH

# GPG 추가 후 업데이트
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
apt update

# elasticsearch 설치
sudo apt install elasticsearch

# elasticsearch 실행
sudo systemctl start elasticsearch

**정상 설치 화면**

Logstash 설치


# logstash 설치
sudo apt install logstash

# logstash 실행
sudo systemctl start logstash

logstash 데이터 전처리 cfg 설정

데이터 입력받는 것을 간단하게 각 VM의 정보를 받는 API를 통해 넘겨주었다.

# 데이터 입력받는 것 설정
input {
        exec {
                command => "curl -H 'X-Auth-Token: 
			gAAAAABkJZImkBifYxra-hxIrT36vHqEObDMkRarCNn2Csl9SEWnqkc4JHakOB4i_IOvecBUK8cf855yfg6dZMY3H1hjCbMk6q-I-J1ejuznpH_fsnRxGK0aIrvvjhfZgganvXHh3tpSAwbaZOwLFvOy8-CyeOFXw8O54l1SDLUcczVfx2yIKUM' 
			-X GET 'http://localhost/compute/v2.1/servers/89b2d322-f519-4a43-9d48-040bfb194c11'"
                interval => 2
                type => "test1"
        }

        exec {
                command => "curl -H 'X-Auth-Token: 
			gAAAAABkJZImkBifYxra-hxIrT36vHqEObDMkRarCNn2Csl9SEWnqkc4JHakOB4i_IOvecBUK8cf855yfg6dZMY3H1hjCbMk6q-I-J1ejuznpH_fsnRxGK0aIrvvjhfZgganvXHh3tpSAwbaZOwLFvOy8-CyeOFXw8O54l1SDLUcczVfx2yIKUM'
			-X GET 'http://localhost/compute/v2.1/servers/2111f258-6428-4b6c-8680-4df287c0b617'"
                interval => 2
                type => "test2"
        }

        exec {
                command => "curl -H 'X-Auth-Token: 
			gAAAAABkJZImkBifYxra-hxIrT36vHqEObDMkRarCNn2Csl9SEWnqkc4JHakOB4i_IOvecBUK8cf855yfg6dZMY3H1hjCbMk6q-I-J1ejuznpH_fsnRxGK0aIrvvjhfZgganvXHh3tpSAwbaZOwLFvOy8-CyeOFXw8O54l1SDLUcczVfx2yIKUM'
			-X GET 'http://localhost/compute/v2.1/servers/45304fe8-ecf4-4b74-8270-fd976349fdfa'"
                interval => 2
                type => "t1"
        }
}

# 데이터 처리
filter {

        if [type] == "test1" {
                json {
                        source => "message"
                }
        }
        else if [type] == "test2" {
                json {
                        source => "message"
                }
        }
        else if [type] == "t1" {
                json {
                        source => "messgae"
                }
        }
}

# 데이터 ElasticSearch에 전송
output {

   elasticsearch {
      hosts => ["localhost:9200"]
      codec => "json_lines"
   }
}
# logstash 재시작
sudo systemctl restart logstash

# logstash 로그 확인
tail -f /var/log/logstash/logstash-plain.log

logstash 로그 확인


별다른 문제 없이 정상적으로 동작함을 확인하였다.


쿼리


test1 인스턴스 정보 요구 쿼리

curl -X GET 'http://localhost:9200/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "type": "test1" } },
        {
          "range": {
            "@timestamp": {
              "gte": "now-1h",
              "lte": "now"
            }
          }
        }
      ]
    }
  },
  "sort": [
    { "@timestamp": "desc" }
  ],
  "size": 1
}'

**쿼리 결과**

여기서 status의 value만 추출하여 출력을 보고 싶어 쿼리를 조정하는 시도를 몇 번 도전을 했지만, 실패...
제대로 한 것 같은데..

Kibana 설치


# kibana 설치하기
sudo apt install kibana

# kibana 설정파일 수정하기
sudo vi /etc/kibana/kibana.yml

# 아래 주석 제거 및 수정
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]

# kibana 실행
sudo systemctl start kibana

input (test1, test2, t1)에 대한 데이터에서 status==ACTIVE 관련 시각화 화면

profile
Infra and Devops 엔지니어가 되고 싶어용

0개의 댓글