oneM2M platform, Mobius server connect with InfluxDB & Grafana - 2nd

유일한·2023년 9월 4일

Mobius_InfluxDB

목록 보기
2/3

저번 포스팅에 이어서, 이번에는 maven을 이용해서 Java로 InfluxDB에 데이터를 업로드 하는 작업을 해보겠다.

Influxd를 실행해서 localhost:8086에 들어가면, sources 탭에 자기가 선택한 언어로 예제 코드를 볼 수 있다.

필자는 자바를 사용하기 때문에 자바 코드를 예시로 들겠다.


자바 코드 작성 전에 maven이나 gradle을 사용하라고 나와있기 때문에, maven이나 gradle 프로젝트를 생성해 주겠다. 필자는 Intellij를 사용 중 이기 때문에, Intellij로 설명하겠다.

maven 프로젝트로 진행 할 것이다. (gradle은 종속성 오류가 많이 나서 maven으로 진행) 대충 maven으로 프로젝트를 빠르게 만들어 주고,

이런 maven 기본 프로젝트가 생성 될 텐데, pom.xml에 들어가서

<dependencies>
        <dependency>
            <groupId>com.influxdb</groupId>
            <artifactId>influxdb-client-java</artifactId>
            <version>6.9.0</version>
        </dependency>
</dependencies>

이런 종속성(dependency)를 추가해주면 된다. 버전은 그때 버전에 맞게 설정해주면 된다.

java 디렉토리 밑에 package를 하나 만들어 주고, 그 밑에 java 코드를 작성하면 된다.


이제 maven 프로젝트도 준비 되었으니, 본격적으로 코드를 작성해보겠다.

package example;

import java.time.Instant;
import java.util.List;

import com.influxdb.annotations.Column;
import com.influxdb.annotations.Measurement;
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import com.influxdb.client.WriteApi;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.write.Point;
import com.influxdb.query.FluxTable;

public class InfluxDB2Example {
  public static void main(final String[] args) {

    // You can generate an API token from the "API Tokens Tab" in the UI
    String token = System.getenv("INFLUX_TOKEN");
    String bucket = "your-Bucket";
    String org = "your-org";

    InfluxDBClient client = InfluxDBClientFactory.create("http://localhost:8086", token.toCharArray());
  }
}

출처 https://github.com/influxdata/influxdb-client-java

이런 코드를 보여주는데, 중요한 부분만 보자면,

String token = System.getenv("INFLUX_TOKEN");

로그인 후에 API Token을 받고 그 token을 여기에 입력해주면 된다. 그래서 token 받고 따로 저장해야한다.

String bucket = "your-Bucket";

설정한 Bucket을 입력해주면 된다.

String org = "your-org";

마찬가지로 설정한 org를 입력해 주면 된다.

미리 Bucket과 org를 설정해주지 않으면 데이터가 들어가지 않기 때문에, 꼭 Bucket, org를 생성해줘야한다.

다음, 3가지 방법으로 InfluxDB에 데이터를 write 할 수 있는 데,

1. Use InfluxDB Line Protocol to write data

이 방법은 전 포스팅에 있던 influxDB protocol line 으로,


출처 https://docs.influxdata.com/influxdb/v2.7/get-started/write/

String data = "mem,host=host1 used_percent=23.43234543";

WriteApiBlocking writeApi = client.getWriteApiBlocking();
writeApi.writeRecord(bucket, org, WritePrecision.NS, data);

이 코드가 protocol lined을 사용하는 방법인데, 위에 초기 설정 코드와 함께 사용해주면 된다.

2. Use a Data Point to write data

Point point = Point
  .measurement("mem")
  .addTag("host", "host1")
  .addField("used_percent", 23.43234543)
  .time(Instant.now(), WritePrecision.NS);

WriteApiBlocking writeApi = client.getWriteApiBlocking();
writeApi.writePoint(bucket, org, point);

1번 방법과 역할은 같지만, Point 객체를 이용해서 measurement, addTag, addFlield 메서드를 이용해서 write 한다.

개인적으로 제일 직관적이고 간단한 방법인 거 같아서 이 방법을 사용했다.

3. Use POJO and corresponding class to write data

Mem mem = new Mem();
mem.host = "host1";
mem.used_percent = 23.43234543;
mem.time = Instant.now();

WriteApiBlocking writeApi = client.getWriteApiBlocking();
writeApi.writeMeasurement(bucket, org, WritePrecision.NS, mem);



@Measurement(name = "mem")
public static class Mem {
  @Column(tag = true)
  String host;
  @Column
  Double used_percent;
  @Column(timestamp = true)
  Instant time;
}

POJO 방법을 이용한 코드로, Plain Old Java Object 라고 하는 데, 자세하게 알 필요는 없고 우리는 코드 사용만 하면 된다.

이제 3가지 방법 중에서 원하는 방법을 통해 코드를 작성하면 된다.
필자의 코드로 예시를 들면

package example;

import java.time.Instant;
import java.util.concurrent.ThreadLocalRandom;

import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import com.influxdb.client.WriteApiBlocking;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.write.Point;

public class InfluxDB2Write {

    private static char[] token = "토큰".toCharArray();
    private static String org = "기관";
    private static String bucket = "버킷";

    public static void main(final String[] args) {
        InfluxDBClient influxDBClient = InfluxDBClientFactory.create("http://localhost:8086", token, org, bucket);

        // 임의의 데이터 생성
        Long time1 = Instant.now().toEpochMilli();
        Double microDust_1_1 = 20.0;
        Double microDust_2_1 = 20.0;
        Double microDust_3_1 = 20.0;
        Double temperature_1 = 25.0;
        Double humidity_1 = 10.0;
        Double ozone_1 = 24.0;
        Double sulfurDioxide_1 = 1.002;
        Double carbonMonoxide_1 = 0.034;
        Double carbonDioxide_1 = 0.002;
        Double windDirection_1 = 97.5;
        Double windSpeed_1 = 1.0;
        

        WriteApiBlocking writeApi = influxDBClient.getWriteApiBlocking();

        // 첫 번째 데이터 포인트
        Point point1 = Point
                .measurement("test1")
                .addTag("sensor_id", "TLM0103") // 태그 추가
                .addField("time", time1)
                .addField("microDust_1", microDust_1_1)
                .addField("microDust_2", microDust_2_1)
                .addField("microDust_3", microDust_3_1)
                .addField("temperature", temperature_1)
                .addField("humidity", humidity_1)
                .addField("ozone", ozone_1)
                .addField("sulfurDioxide", sulfurDioxide_1)
                .addField("carbonMonoxide", carbonMonoxide_1)
                .addField("carbonDioxide", carbonDioxide_1)
                .addField("windDirection", windDirection_1)
                .addField("windSpeed", windSpeed_1)
                .time(time1, WritePrecision.MS);

       

        // InfluxDB에 데이터 저장

        writeApi.writePoint(bucket, org, point1);

        influxDBClient.close();
    }
}

이제 실행 시키면 잘 올라가고 InfluxDB에서 확인 할 수 있다.

terminal 에서 influxd 를 입력해서 influxdb가 실행되고 있다는 가정하에 진행하고 있다.

Dashboard 탭에 들어가면 create dashboard 를 해서 add cell 하면 이런 페이지가 나오는 데,

이 그래프는 내가 한 프로젝트의 최종 결과물이다. 처음 더미 데이터를 입력하면, 데이터 플로우는 없고 점만 찍혀 있을 것 이다.

InfluxDB는 시계열 데이터베이스 이기 때문에, 시간 흐름에 따라 데이터를 보여줘서 데이터를 한번 입력하는 것은 InfluxDB를 사용하는 의미가 없다.

이제 grafana를 설치해서 InfluxDB와 Connection 해서 더욱 멋진 시각화 템플릿을 보여주는 것을 하겠다.

Grafana 설치

https://grafana.com/

회원가입하면 된다.

mac os는 Homebrew를 이용해서 설치하면 되고, Manually download 할 사람들은 홈페이지에서 download 탭에 들어가서 알려주는 데로 설치하면 된다.

brew install grafana
brew services start grafana

이러면 실행 된다. 이제 localhost:3000 으로 브라우저에서 접속하면, 로그인 페이지가 나오는 데 grafana 회원가입 할 때 ID, password 가 아니라, ID : admin password : admin 을 하면 로그인이 된다.

로그인이 성공하면 페이지가 나오고, Connection 탭에 들어가서 InfluxDB를 검색하여 선택한다.

Create 버튼을 눌러서 버전을 1.x 2.x 이라고 되어있는 flux 버전을 선택해주면 된다.

다른 설정은 상관 없고, 맨 밑에 자기가 생성한 org, Token, Bucket을 입력하면 된다.

이제 Dashboard 탭에 들어가서 생성하면 연결 완료가 된다.

profile
데이터 엔지니어

0개의 댓글