본문 바로가기
Data/ELK

[2021.07.26] 인턴 +147 Tips)How to display on a map using latitude and longitude in elasticsearch?(+ 공기질 데이터 수집 하는 방법(포스트맨 POSTMAN), geoip 변환 시 중요한점)

by injekim97 2021. 7. 26.
반응형

[2021.07.26] 인턴 +147   Tips)How to display on a map using latitude and longitude in elasticsearch?(+ 공기질 데이터 수집 하는 방법(포스트맨 POSTMAN), geoip 변환 시 중요한점)

 

 

 

 

해당 게시글은, 아파치 로그(apache log) 또는 IP로 maps에 표시하는 것이 아니다.

단지, 위도와 경도로만 maps(geoip) 에 표시하는 방법을 알아보자.

 

 

 

 

----------------------------------------------------------------------------------------------------------------------------

우선, kibana에 접속하여 dev tools에 아래와 같은 명령어를 수행하자.

PUT 0726_finall_air_quality
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_point"
      }
    }
  }
}

 

 

-> 위의 코드를 복붙해주면 true 라고 200-OK 정상적으로 실행 된다.

 

 

----------------------------------------------------------------------------------------------------------------------------
0726_finall_air_quality.conf

 

 

error message

WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console

 

* 해결방법

->  logstash경로 설정

ubuntu@ip-172-31-9-174:/usr/share/logstash/bin$ ./logstash -f 1800_final_air.conf --path.settings /etc/logstash/

 

 

 

 

 

<소스코드>

input {
    jdbc {
        jdbc_driver_library => "/usr/share/java/mysql-connector-java-8.0.25.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://localhost:3306/DATA?allowPublicKeyRetrieval=true&useSSL=false&user=root&password=root"
        jdbc_user => "root"
        jdbc_password => "root"
        schedule => "* * * * *"
        statement => "select * from air_quality"
        type => "air_quality"
        tracking_column => "table_12"
        use_column_value => true
        }
}



filter {
    csv {
      separator => ","
      columns => ["SerialNum", "Co2", "Humid", "Pm10", "Pm5", "Temp", "Vocs", "TimeZone", "ReportTime", "lat", "long","doc_id"]
      }
    mutate {convert => ["lat", "float"]}
    mutate {convert => ["long", "float"]}
  
    mutate {
        add_field => {"[location][lat]" => "%{lat}"}
        add_field => {"[location][lon]" => "%{long}"}
     }
    mutate {
        convert => {"[location][lat]" => "float"}
        convert => {"[location][lon]" => "float"}
     }  
}


output {
    elasticsearch {
        hosts => "localhost:9200"
        index => "geo_test10"
        user => "elastic"
        password => "d2L79ArdVSJqbxqATuKj"
        document_id => "%{doc_id}"        
        }

    stdout {
        #codec => dots {}
        codec => rubydebug
    }
}

 

input {
    jdbc {

        jdbc_driver_library => "/usr/share/java/mysql-connector-java-8.0.25.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://localhost:3306/DATA?allowPublicKeyRetrieval=true&useSSL=false&user=root&password=root"
        jdbc_user => "root"
        jdbc_password => "root"
        schedule => "* * * * *"
        statement => "select * from air_quality"
        type => "air_quality"
        tracking_column => "table_12"
        use_column_value => true
        }
}

filter {
    csv {
      separator => ","
      columns => ["SerialNum", "Co2", "Humid", "Pm10", "Pm5", "Temp", "Vocs", "TimeZone", "ReportTime", "lat", "long","doc_id"]
      }

    mutate {convert => ["lat", "float"]}
    mutate {convert => ["long", "float"]}
    mutate {
        add_field => {"[location][lat]" => "%{lat}"}
        add_field => {"[location][lon]" => "%{long}"}
     }
    mutate {
        convert => {"[location][lat]" => "float"}
        convert => {"[location][lon]" => "float"}
     }  
}

output {
    elasticsearch {
        hosts => "localhost:9200"
        index => "0726_finall_air_quality"
        user => "elastic"
        password => "d2L79ArdVSJqbxqATuKj"
        document_id => "%{doc_id}"        
        }

    stdout {
        #codec => dots {}
        codec => rubydebug
    }
}



위도와 경도로 geoip 최종 성공.conf.conf
0.00MB

 

---------------------------------------------------------------------------------------------------------------------------------

<실행 결과>

 

 

------------------------------------------------------------------------------------------------------------------------

공기질측정기 데이터 수집 하는 방법(포스트맨 POSTMAN)

 

* 아래사진처럼 설정해주면 됨

 

1. POST https://us-central1-mytypescript-62c14.cloudfunctions.net/getData? 

 

 

2. Headres  Content-Type : application/json

 

3. Body

{

   "fromDate" : "20210726000000",

   "toDate" : "20210726235959",

   "serialNum" :"abc"

}

 

 

 

 

 

 

 

 

 

 

 

 

 

-> 출력된 데이터값을 3시방향 동그라미 클릭해서 복사

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

--------------------------------------------------------------------------------------------------------------------------

이제,  Lat 과 Long(위도와 경도) 데이터가 암호화되서 나왔기 때문에 정렬 후 , 암호화된 데이터를 삭제하고 저장하자.

 

 

 

 

 

-> 이제 암호화된 위도와 경도를 버리고 수치 값으로 나온 위도와 경도를 잘라내기 후, 새로 엑셀파일을 열어서 저장하면 끝

 

 

 

-------------------------------------------------------------------------------------------------------------------------------

* 08.16 geoip 변환 시 중요한점(conf 파일에서 filter 할 때 중요)

 

 

 

 

<conf 파일에서 geo_location의 값을 제대로 넣지 않았을 때>

-> 출력 보면, geo_location 타입의 lon의 값이 0.0으로 들어간 것을 알 수 있다.

 

 

 

-> 처음에 conf 파일이 geoip에 대해 반환을 못해서 위치가 바다에 찍혔다.(앞에서 말했다 시피, 위에서 lon 값이 0.0 이라서)

 

 

 

 

 

 

 

 

 

<08.16 작동하는 conf 파일>

input {
    jdbc {
        jdbc_driver_library => "/usr/share/java/mysql-connector-java-8.0.26.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://localhost:3306/AIR?allowPublicKeyRetrieval=true&useSSL=false&user=root&password=root"
        jdbc_user => "root"
        jdbc_password => "root"
        schedule => "* * * * *"
        statement => "select * from hanbang_air_data"
        type => "hanban_air_data3"
        tracking_column => "table_6"
        use_column_value => true
        }
}



filter {
    #csv {
    #  separator => ","
    #  columns => ["SerialNum", "Co2", "Humid", "Pm10", "Pm5", "Temp", "Vocs", "timeZone", "ReportTime", "Lat", "Lng"]
    #  }

    mutate {convert => ["lat", "float"]}
    mutate {convert => ["lng", "float"]}

    mutate {convert => ["co2", "float"]}
    mutate {convert => ["vocs", "float"]}
    mutate {convert => ["pm10", "float"]}
    mutate {convert => ["pm5", "float"]}
    mutate {convert => ["humid", "float"]}
    mutate {convert => ["temp", "float"]}

    mutate {
        add_field => {"[location][lat]" => "%{lat}"}
        add_field => {"[location][lon]" => "%{lng}"}
     }
    mutate {
        convert => {"[location][lat]" => "float"}
        convert => {"[location][lon]" => "float"}
     }
}





output {
    if[type] == "hanban_air_data3" {
    elasticsearch {
        hosts => "logstash.monorama.kr:9200"
        index => "hanban_air_data3"
        user => "elastic"
        password => "IfhOjyslb5wE0yTd8kQa"
        document_id => "%{num}"
        }
    }
    stdout {
        #codec => dots {}
        codec => rubydebug
    }
}

-> 해당 공기질 데이터들은 소수형으로 값이 반환 되기 떄문에, mutate를 이용하여 float으로 type을 변환해줘야 한다.

 

 

 

 

<출력 결과>

-> 여기서 보면 출력결과가 lat,lng 로 되어 있기 때문에 float으로 반환 해줘야 한다.

 

 

-> 위의 사진의 출력결과를 보면서 lat,lng을 밑줄 친 lat,lng에 넣어주면 된다.

 

 

<위도와 경도로 지도 찍은 사진>

 

반응형

댓글