* 해당 글은 리눅스 기준 입니다. (CentOS 7버전, Ubuntu18에서 잘됨)



InfluxDB 2.x 설치 

(docs.influxdata.com/influxdb/v2.0/get-started/?t=Linux) 

아래 2가지 방식 중에 패키지로 서비스로 시작하는것을 추천한다.

파일로 받아서 실행 하기)

  1. curl -s https://repos.influxdata.com/influxdb2.key | gpg --import -
  2. wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-linux-amd64.tar.gz

   3. tar xvzf influxdb2-2.0.4-linux-amd64.tar.gz
   4. cd influxdb2-2.0.4-linux-amd64
   5. influxd  로 시작한다. 


패키지로 인스톨 및 서비스시작하기   (arm64 or amd64 시스템에 맞게 변경해야함)

- RedHat & CentOS (amd 64-bit)

https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4.x86_64.rpm
sudo yum localinstall influxdb2-2.0.4.x86_64.rpm

systemctl start influxdb 
systemctl enable influxdb 
systemctl status influxdb 

- Ubuntu & Debian (amd 64-bit)

https://dl.influxdata.com/influxdb/releases/influxdb2-2.0.4-amd64.deb
sudo dpkg -i influxdb2-2.0.4-amd64.deb

 

sudo service influxdb start
sudo service influxdb status


InfluxDB UI설정하기 

최신 InfluxDB는 UI도 수려하게 지원한다. 따라서 UI를 통한 셋업방법을 알아보자.

1. localhost:8086 으로 접속하면 UI에 접근할수있다.
2. 아래 설정을 넣는다. (매우 중요하다.)

  1. Username 넣어준다.   (예: hama) 
  2. Password 넣어준다.  (기억해두시라) 
  3. Organization 이름 넣어준다.  <-- 이전버전에는 없는 것이다.
  4. Bucket 이름 생성한다.  <-- 이전버전에는 없는 것이다. 
  5. Click Continue.

3. 메인 화면에서 Build a dashboard 를 선택한다. 

4. Create Dashboard 를 선택한다. 

5. Add Cell 을 선택한다. 

6. 
- from (bukcet) :  monitoirng 선택한다. 즉 bucket 이름이다
- filter (_measurement)  : folder_status 를 선택한다. .
- filter (_field) : size를 선택한다. 
- filter (tag) : tag를 선택한다. 
- 5s refresh : 5초마다 화면을 갱신해준다
- past 1h : 과거 1시간 전 데이터 부터 보여준다
- Submit : 적용한다. 

Influxdb의 ui를 통해 위와 같이 나오는 것을 볼 수 있다. (메뉴얼없어도 직관적으로 다룰 수 있을 것이다)

InfluxDB에 데이터 넣기 

대략 아래와 같이 코딩하자.  (참고 소스 : https://github.com/wowlsh93/monitoring)

module github.com/wowlsh93/monitoring

go 1.14

require (
    ....
	github.com/influxdata/influxdb-client-go/v2 v2.2.2
)

- influxdb 클라이언트 의존성은 v2.2.2 

//DBPATH: http://localhost:8086
//AUTHTOKEN: zYR-2G5BRmb5SDIkbKRUe2DXyon4rbXEzjoTwsSDHMUWeO3hTjasWBIGw8W7Dy_QxipDNWOj2g5MMD9le8-B3Q==

db := influxdb.Influxdb{
	Client :  influxdb2.NewClient(conf.DBPATH, conf.AUTHTOKEN),
}

- influxdb를 접근하기위해서는 db 경로와 auth 토큰이 필요하다. 
auth token 발급법은 docs.influxdata.com/influxdb/v2.0/security/tokens/create-token/ 링크에서 알수있다.
간략히 설명하면 UI에서 Data -> Tokens를 가면 발급받을 수 있다. (아래 빨간색 사각형)

package influxdb

import (
	"context"
	"github.com/influxdata/influxdb-client-go/v2"
	"time"
)

type Influxdb struct {
	Client influxdb2.Client
}

func (db* Influxdb) AddData(measurement string, curSize int64) {
	writeAPI := db.Client.WriteAPIBlocking("opusm", "monitoring")
	p := influxdb2.NewPointWithMeasurement(measurement).
		AddTag("storage", "total").
		AddField("size", curSize).
		SetTime(time.Now())

	writeAPI.WritePoint(context.Background(), p)
}
func (db* Influxdb) Close() {
	db.Client.Close()
}

- 위와 같이 influxdb에 값을 넣을 수 있다.
- "opusm" 은 조직이고
- "ledgermaster" 은 버켓이고 (참고로 이건 데이타베이스라고 생각하자.)
- Measurement 도 지정하자. (참고로 이건 테이블과 비슷하다고 보면 된다) 
- Tag, Field 도 넣어주자 (참고로 Tag는 인덱싱되는 컬럼, Field는 그냥 컬럼들이라고 생각하자, 둘다 key,value 쌍이다)
- Field 값은 필드 값은 strings, floats, integers, boolean 타입을 가진다. 
- 해당 timestamp에 field set, tag set 들이 구성된다.  (key, value 를 합쳐서 set이라고 한다) 

* tag 는 아래와 같이 사용된다. 

butterflies 와 honeybees의 갯수는 일반 필드이고, location 과 scientist는 tag인데 생각을 해보자!!  보통 우리는 과학자에 필터링을 걸 것어서 사용 할 것이다. scientist=perpetua 처럼 말이다. perpetua 과학자가 처리한 데이터만 골라서 보여주고 싶을 것이다. 이런 그룹짓고 싶은 필터링에 indexing을 거는 것이다 tag를 사용해서~~

* 포인트와 시리즈이라는 개념도 중요한데 시리즈에 대해 잘 이해가 안가는..

Telegraf 1.17   (influxdb2 용) 

(docs.influxdata.com/telegraf/v1.17/introduction/getting-started/)

1. 설치하기 

Ubuntu & Debian
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.17.3-1_amd64.deb sudo dpkg -i telegraf_1.17.3-1_amd64.deb

RedHat & CentOS
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.17.3-1.x86_64.rpm
sudo yum localinstall telegraf-1.17.3-1.x86_64.rpm

Linux Binaries (64-bit)
wget https://dl.influxdata.com/telegraf/releases/telegraf-1.17.3_linux_amd64.tar.gz
tar xf telegraf-1.17.3_linux_amd64.tar.gz


2. 기본설정하기 

2-1)
vi /etc/telegraf/telegraf.conf 에서 
[[outputs.influxdb_v2]]
urls = ["$INFLUX_HOST"]
token = "$INFLUX_TOKEN"
organization = "$INFLUX_ORG"
bucket = "telegraf"

을 해주면 influxdb2로 출력해준다. 

2-2))
telegraf -sample-config --input-filter cpu:mem --output-filter influxdb > telegraf.conf
cpu 사용량 및 메모리 사용량에 대한 메트릭을 읽게한다. 아래의 output출력으로 정보를 보낼 수 있다.


3. 시작하기 

systemctl start telegraf <-- 시작하기
sudo systemctl status telegraf  <-- 확인하기 

UI의 telegraf 버킷에 각종 system 값들이 들어온것을 볼 수 있다. 

4. 특정폴더사이즈 감시 

4-1) 
#!/usr/bin/env bash
du -bs "${1}" | awk '{print "[ { \"bytes\": "$1", \"dudir\": \""$2"\" } ]";}'

를 metrics-exec_du.sh 이름으로 만든다.

4-2) 아래를 telegraf.conf파일에 추가한다.

[[inputs.exec]]
  commands = [ "YOUR_PATH/metrics-exec_du.sh /var/lib/influxdb/data" ]
 timeout = "10s"
 name_override = "quorum-test"
 name_suffix = ""
 data_format = "json"
 tag_keys = [ "dudir" ]

4-3) systemctl restart telegraf  로 다시 시작한다.  

du 가 추가된 것을 볼 수 있다.

Grafana 8.0.6


1. 설치하기 grafana.com/grafana/download

Red Hat, CentOS, RHEL, and Fedora(64 Bit)

wget https://dl.grafana.com/oss/release/grafana-8.0.6-1.x86_64.rpm
sudo yum install grafana-8.0.6-1.x86_64.rpm

Ubuntu and Debian(64 Bit)

sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/oss/release/grafana_8.0.6_amd64.deb
sudo dpkg -i grafana_8.0.6_amd64.deb

2. 실행하기  grafana.com/docs/grafana/latest/installation/rpm/#2-start-the-server

sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl status grafana-server
sudo systemctl enable
grafana-server

* 방화벽 해제 (centos에서 외부에서 3000포트로 접근하려는데 방화벽이 실행중이라면)
sudo systemctl stop firewalld

3. Grafana UI 다루기 grafana.com/docs/grafana/latest/getting-started/getting-started/

브라우저에서 다음 주소로 Grafana UI 에 들어간다. => http://localhost:3000/

admin/admin 으로 들어간후에 비밀번호 바꿔준다. 

메인화면은 위와 같다. 

4. Data Source 추가하기 

Data sources선택 

InfluxDB 선택 

* 이전버전 InfluxDB 데이타소스 방식과 매우 많이 달라졌다. (4버전대가 편했는데....) 
- 이름은 아무거나 만들어주고
- 여기선 Query Language 를 Flux로 한다. 이게 새로 추가된 방식이다. (InfluxDB 2.x대에는 이걸 써야한다)
- HTTP에 URL을 http://your ip address:8086

나머지는 건드리지 않았다. (혹시 Basic auth 켜있으면 꺼준다)

- 조직은 influxdb 설정에서 만든것을 넣어준다. 
- 토큰은 influxdb 에서 만든 auth token 문자열을 넣어준다.
- 버킷에는 influxdb 설정에서 만든 것을 넣어준다.

나머지는 건드리지 않았다. 
Save& Test를 해주며 끝마친다. 

5. 데시보드 추가하기 

Dashboard선택 

일단 Add an empty panel 을 선택한다.

이전 버전(4.x대 이전)과는 굉장히 많은 차이가 있다.

- Flux language syntax 를 이용하여 쿼리하여 데이터를 보여준다.
- bucket 으로 부터 3시간 이전 데이터부터 2시간 이전데이터까지를 보여준다. 
- 새로 만들어진 Flux 스크립트 기반으로 모니터링 환경을 꾸미려면 관련 학습이 선행되어야 할 것 같다. 

Getting start with Flux => https://docs.influxdata.com/influxdb/v2.0/query-data/get-started/

이로써 기초적인 설치와 세팅이 끝났다.


6. Flux 예제 


-  example-bucket 이란 이름의 버킷으로 부터 데이터를 가져온다.
- 1시간 전 부터 시작하는 데이터를 가져 온다
- measurement 는 "cpu" 를 가져온다.
- tag 키가 cpu이고 tag 밸류가 "cpu-total" 인 포인트만 가져온다. 
- 1분간의 데이터를 평균(mean)하여 가져온다. (즉 그래프에는 1시간 전부터 시작하여 1분당 한개의 값만 나올 것이다.)



https://bl.ocks.org 싸이트를 보면 굉장히 다양한 d3.js 예제들이 있으니 참고 하십시요.
이 글은 글 마지막의 레퍼런스를 요약한 것이니, 구체적인 설명은 링크를 따라가서 읽어보십시요.
아래 내용은 윈도우8에서 테스팅하고 확인 하였습니다. (패키지 버전을 확인하세요. 버전이 다르면 본 문서의 명령어가 안먹힐 수도 있습니다.)

+  


개발환경 세팅 

자바스크립트 개발 환경 세팅

Node 설치  (npm 이용 및 브라우저 없이 실행하기 위함)

VS CODE 편집기 설치  (편집기는 아무거나~) 


1. 프로젝트 폴더 생성

mkdir d3v4-with-ts
cd d3v4-with-ts


2. 폴더 내에서 package.json 생성 (패키지 및 프로젝트 관리를 위함) 
npm init -y

3. 패키지 받아오기 (d3 와 타입스크립트를 설치합니다. -S 는 --save , -D 는 --save-dev) 
npm i -S d3@^4.13.0
npm i -D typescript@^2.4.2
npm i -D @types/d3@^4.10.0


타입스크립트 컴파일 환경 세팅
(타입스크립트를 Node 실행기가 이해하는 언어로 변경하기 위함)

 

4. 타입스크립트 컴파일러 설정 파일 만들기 (파일명: tsconfig.json)

{
"compilerOptions": {
"noImplicitAny": true,
"target": "es5",
"sourceMap": true,
"declaration": true,
"module": "es2015",
"moduleResolution": "node"
},
"exclude": [
"node_modules",
"dist"
]
}


  •  noimplicitAny : 모든것은 타입을 명시적으로 가져야 한다. 
  •  es5 버전의 자바스크립트로 컴파일하라. 
  •  소스캡을 만들어라. 브라우저에서 오리지날 파일에 대한 디버깅을 할 수 있다.
  •  es2015 (or es6) 모듈 타입을 사용하라. 
  •  노드가 하는 것처럼 모듈을 해석하라. 더 자세한 것은 여기 참고 here.




5. src 폴더를 만들고 그 안에 app.ts 파일을 만들고 일단 아래 내용 입력 

console.log('hello, world');


6. 커맨드라인에서 아래를 입력하여 타입스크립트를 js 로 변경 해보자

.\node_modules\.bin\tsc

build01

이렇게 js 파일들이 생겨 날 것이다. 

7. 위의 명령이 너무 길기 때문에 줄여 보자. package.json 의 script 섹션안에 아래 내용 입력

"build"
"tsc"

"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "tsc"
},


파일을 저장하고 이제 다음과 같이 명령하면 자동적으로 타입스크립트를 빌드 할 것이다.

npm run build


현재는 src 폴더 안에 ts 파일과 컴파일된 js 파일이 같이 저장될 것이나, 나중에는 따로 저장하게 만들어서 관리하기 편하게 할 것이다.

롤업을 이용한 번들링  
(브라우저가 이해하는 형태로 변경하기 위함)

8. 이제부터 번들링을 시작해보자. rollup 패키지를 설치한다. (참고로 라이브러리 번들링에는 Webpack 보다 더 낫다고 한다. Webpack and Rollup: the same but different)

npm i -D rollup@^0.45.2

9. 모드 모듈을 해결하기 위해서 플러그인도 설치 하자.
npm i -D rollup-plugin-node-resolve@^3.0.0

10. rollup 을 설정하기 위해서 rollup.config.js 파일을 만들고 아래 내용 입력

import resolve from 'rollup-plugin-node-resolve';

export default {
entry: 'src/app.js',
dest: 'src/bundle.js',
format: 'umd',
plugins: [
resolve({
jsnext: true,
main: true,
module: true
})
],
moduleName: 'app'
};



11. 아래 명령어를 실행해서 번들링하자. src/bundle.js 파일이 생겨 날 것이다.
.\node_modules\.bin\rollup -c
 (-c 는 설정파일을 이용하라는 의미)

12. 역시 너무 길기 때문에 다시 package.js 의 scripts 섹션에 build 를 수정하자.

"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "tsc && rollup -c"
},


파일을 저장하고 이제 다음과 같이 명령하면 자동적으로 타입스크립트를 컴파일해서 js 만들고 js 를 번들링 해서 최종적으로 브라우저가 이해 할 수 있는 js 파일로 만들 것이다. (파일 크기를 줄이고, 난독화하는 설정도 추가 가능하다) 


npm run build

비스 시작하기 

13.  간단하게 파일을 서비스 하기 위해 live-server 설치
npm i -D live-server@^1.2.0

14.  package.json 의 scripts 섹션에 아래 추가 (html,js,css 를 읽어서 서비스 제공 및 변화 감시)
"serve": "live-server src --watch=src/**/*.html,src/bundle.js,src/**/*.css"

"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "tsc && rollup -c",
"serve": "live-server src --watch=src/**/*.html,src/bundle.js,src/**/*.css"
},


15. src 폴더 아래에 index.html 파일 생성 (bundle.js 파일을 참조하여 브라우저에서 표현)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>D3 with TypeScript</title>
</head>
<body>
<script src="/bundle.js"></script>
</body>
</html>


16. 드디어 서비스 시작!! 이제 브라우저에서 index.html 을 열어서 컨텐츠를 확인할 수 있다. 현재는 아무것도 안나올 것이며, F12 개발자도구의 콘솔창을 통해 hello, world 를 확인 할 수 있다.
npm run serve

17. 만약 app.ts 의 내용이 바꾸고 다시 빌드 하면 바뀐 내용을 볼 수 있을 것이다.
npm run build



TS 파일 변화에 대한 감시(Watching)
(지금까지는 ts파일을 변경해도 브라우저에서 내용이 변하지 않았다. 감시기는 JS,HTML 만 감시하지 ts를 감시하지는 않았기 때문인데, 이제 ts 포맷을 감시하도록 해보자)

18. 타입스크립트 내용을 변경 시킬 때마다 build 를 한다는것은 매우 귀찮은 일이다. rollup-watch 를 통해 해결하자.
npm i -D rollup-watch@^4.3.1

19. Pakcage.json 파일에 scripts 에 다음 내용을 추가하자.

"tsc:w": "tsc -w",
"rollup:w": "rollup -c -w",


20. 아래와 같은 명령어를 터미널 3개를 열어서 실행 시키면 app.ts가 바뀌었을때 브라우저도 자동으로 바뀔 것이다. 
npm run serve
npm run tsc:w
npm run rollup:w


Scripts 의 모든 명령을 한방에 해결하기 

21
.  이 모든것을 한방에 하기 위해서는 아래 패키지를 설치한다.

npm i -D npm-run-all@^4.0.2

22.  Package.json 에 아래 "start" 를  추가하고

"scripts": {
...
"start": "npm-run-all --parallel tsc:w rollup:w serve"
},


23
.  npm start 로 실행하면 모든게 한방에 된다. 이제 부터 ts,html 아무것이나 수정해도 브라우저에는 최신 내용이 업데이트 될 것이다.

npm start

D3 로 차트 만들기 

자 이제부터 본론인 데이터 가시화로 들어가 보자. (-.-;;) 

d3.js 는 차트라이브러리가 아니다. d3 는 데이터를 웹페이지 상에서 표현하는것을 도와주는 로우레벨 API 이다. 따라서 손쉽게 차트를 나의 서비스에 추가하고 싶은 분이라면 d3 기반의 좀 더 사용하기 쉬운 라이브러리나 엑셀차트를 사용하는 편이 더 낫다. 내가 d3.js 를 선택한 이유는 내 구미에 맞는 데이터 가시화를 하기 위해서이다. 따라서 d3.js 를 시작하기 위해서는 자바스크립트 및 DOM 이 무엇이며 SVG 가 무엇이지에 대한 기초 지식은 필수이다. 

d3.js 밑바닥 맛보기

아래와 같은 도형의 나열을 d3.js 를 이용하여 표현해보자.

1. HTML 의 body 요소 아래에 svg 요소를 추가하자. (DOM 추가) 

let svg = d3.select("body").append("svg");


2. 해당 svg 요소의 크기를 설정해준다. (attr 를 이용한다. style 을 이용하여 이쁘게 할 수 도 있다)

const w = 960;
const h = 480;

svg.attr("width",w);
svg.attr("height", h);


3. DOM에 바인딩할 데이터를 준비해두고,

let dataset = [5,10,15,20,25];


4. 데이터를 바인딩할 DOM 을 만들어서 HTML 문서에 추가한다. circle 이라는 DOM 들을 선택하고 , dataset 의 크기 만큼  바인딩하는데 ,이때 선택된 DOM 보다 data 가 더 많은 경우 , enter 를 이용해서 임의의 요소를 만든 후에 , circle 이라는 DOM 을 append 해준다라는 의미이다.

- enter에 대한 설명은 요기 참고 -> http://blog.nacyot.com/articles/2015-02-02-d3-selection/

let circle = svg.selectAll("circle")
.data(dataset)
.enter()
.append("circle")


5. svg 에 circle 요소가 추가되었으니, 이제 circle 에 대한 속성을 추가해보자. circle 이 위치할 x,y 좌표와 반지름을 속성에 넣어준다. 반지름의 경우는 바인딩된 data 의 개별 요소가 익명함수를 이용하여 들어간다.

circle.attr("cx", function(d,i){
return (i * 50) + 25;
})
.attr("cy", h/2)
.attr("r", function(d){
return d;
})


좀 더 그럴싸한 차트를 그려보자.

이 단락에서는 위와 같은 챠트를 얻을 것이다. reddit API를 사용하여 마지막 25개의 포스트에 대한 스코어를 표현 할 것이다.

차트 구성 요약 

기본 차트 구성은 아래와 같을 것이다.

  • the svg (dark background)
  • the plot area (light background)
  • the axes (blue text)
  • the points (orange)

그러기 위해서 우리는 아래와 같은 절차를 밟을 것이다.

  • svg 만들기 
  • plot area 만들기 
  • plot area 에 x-축에 대한 그룹 추가 
  • plot area 에 y-축에 대한 그룹 추가 
  • plot area 에 데이터 포인트들에 대한 그룹 추가 

전체적인 외형 만들기 

import * as d3 from 'd3';
import { redditObject } from './redditFormat';
const width = 960;
const height = 480;
let svg = d3.select('body')
.append('svg')
.attr('width', width)
.attr('height', height);
let plotMargins = {
top: 30,
bottom: 30,
left: 150,
right: 30
};
let plotGroup = svg.append('g')
.classed('plot', true)
.attr('transform', `translate(${plotMargins.left},${plotMargins.top})`);
let plotWidth = width - plotMargins.left - plotMargins.right;
let plotHeight = height - plotMargins.top - plotMargins.bottom;


- 아무것도 없는 HTML 파일에 동적으로 svg 엘리먼트를 추가하고 그것의 크기를 960 / 480으로 설정한다.
- 차트외형은 왼쪽에서 150, 위에서 30 만큼 이동해서 그려준다. plot 로 클래스명 설정

축 만들기 


let xScale = d3.scaleTime()
.range([0, plotWidth]);
let xAxis = d3.axisBottom(xScale);
let xAxisGroup = plotGroup.append('g')
.classed('x', true)
.classed('axis', true)
.attr('transform', `translate(${0},${plotHeight})`)
.call(xAxis);
let yScale = d3.scaleLinear()
.range([plotHeight, 0]);
let yAxis = d3.axisLeft(yScale);
let yAxisGroup = plotGroup.append('g')
.classed('y', true)
.classed('axis', true)
.call(yAxis);

- X,Y 축을 그려준다. 위치등을 자신이 알아서 설정 할 수 있다. 
- X 축은 시간축으로 그리기 위해서 scaleTime() 함수를 이용했고
- Y 축은 일반적인 데이터 크기에 따라서 그려지기 위해 scaleLinear() 를 이용했다. 
- 항상 순서는 scale 설정 ->  axis 에 
scale 을 추가 -> plot 에 axis 추가  방식이다.

데이터 가져와서 바인딩 하기 

d3.json<redditObject>('https://api.reddit.com', (error, data) => {
if (error) {
console.error(error);
} else {
console.log(data);
}
});
let prepared = data.data.children.map(d => {
return {
date: new Date(d.data.created * 1000),
score: d.data.score
}
});
console.log(prepared);

- reddit 데이터를 가져와서 설정해준다. score: d.data.score 
- 시간은 unix timestamp (세컨드 + 소수점) 에서 javascript 시간 타입(밀리세컨드)으로 변경.


스케일/축 업데이트 하기

xScale.domain(d3.extent(prepared, d => d.date))
.nice();
xAxisGroup.call(xAxis);
yScale.domain(d3.extent(prepared, d => d.score))
.nice();
yAxisGroup.call(yAxis);


- 위에서 만든 기존 x,y 축을 데이터에 적합하게 바꾼다. 즉 데이터의 시간과 데이터 값의 min,max 에 따라서 축의 도메인을 변하게 만든다. 

데이터 포인트 드로잉


var dataBound = pointsGroup.selectAll('.post')
.data(prepared);

// delete extra points
dataBound
.exit()
.remove();

// add new points
var enterSelection = dataBound
.enter()
.append('g')
.classed('post', true);

enterSelection.append('circle')
.attr('r', 2)
.style('fill', 'red');

// update all existing points
enterSelection.merge(dataBound)
.attr('transform', (d, i) => `translate(${xScale(d.date)},${yScale(d.score)})`);


- 데이터 별 원형의 반지름2이고 빨강색으로 채워진 도형을 추가해줍니다.


완전한 코드샘플은 여기에 있습니다
 GitHub.


레퍼런스:

https://hstefanski.wordpress.com/2017/07/23/d3-v4-and-typescript-getting-set-up/
https://hstefanski.wordpress.com/2017/08/15/creating-a-chart-with-d3-v4-and-typescript-or-es6/


참고: apt-get 에서 remove 는 그냥 패키지만 삭제하는것이고 purge는 설정파일도 같이 삭제하는 것이다.


Uninstall grafana

Ubuntu 16.04 에서 그냥 그라파나 패키지 삭제하기  

sudo apt-get remove grafana

Uninstall grafana and it's dependent packages

그라파나 패키지와 다른 의존적 패키지들을 같이 삭제하기 

sudo apt-get remove --auto-remove grafana

Purging grafana

설정파일등도 같이 삭제하기  

sudo apt-get purge grafana

데이타파일들도 같이 삭제하기 

sudo apt-get purge --auto-remove grafana




Grafana 사용자 관리 정책 정리

1. 어드민 및 사용자 비밀번호 변경 하기 


Profile 안에 Change Password 가 있다.


2. 사용자별 ID/PWD 만들기 

Global Users 클릭

Add new user  클릭


3. 조직 구성 하기 

New organization 선택

New organization 생성


4. 해당 조직에 사용자 추가하기 

User 목록에서 원하는 유저에 대한 에디트 클릭

Edit User 에서 조직 추가하고 권한 부여 (Viewer, Editor 등) 


Tip

1. admin 비밀번호 잊어 버렸을 때 

grafana-cli admin reset-admin-password ...

이렇게 해서 안되면 

grafana-cli admin reset-admin-password --homepath "/usr/share/grafana" newpass

이렇게 합니다.


Alerting -> Notification channels 선택 하시구요.

s


Edit Channel 을 통해 편집하겠습니다.



텔레그램 선택하고 (슬랙등도 비슷합니다잉~)

1. 텔레그램에서 봇파더를 이용해서 새로운 봇을 만들고 (이건 알아서 검색해 보세요. 쉽습네다~)

2. 새로운 봇에 해당하는 BOT API TOKEN 을 얻어서 입력해 줍니다. 아래 빨강색 입니다~




3. Chat ID 는 

   - 원하는 쳇 그룹에 위의 새로운 봇을 추가하고
   - 브라우저에서  https://api.telegram.org/botXXX:YYYY/getUpdates  같이 입력하면

(XXX:YYYY는 위의 BOT API TOKEN) 

  

 {"ok":true,"result":[{"update_id":687973817, "message":{"message_id":6,"from":{"id":68618491,"is_bot":false,"first_name":"\uc2b9\ud604(brad)","last_name":"Lee","username":"wowlsh93"},"chat":{"id":-1001161229627,"title":"company_NMS","type":"supergroup"},"date":1512122266,"text":"/my_id @jinyoung_watt_bot","entities":[{"offset":0,"length":6,"type":"bot_command"},{"offset":7,"length":18,"type":"mention"}]}}]}

처럼 날라오는데 -1001161229627 이것이 CHAT_ID 입니다잉~


4. 사용하기







Bringing Matplotlib to the Browser


Quick Start Guide

pip 을 통해 간단히 설치 

pip install mpld3

기존에 사용하듯이 사용한다.

import matplotlib.pyplot as plt, mpld3
plt.plot([3,1,4,1,5], 'ks-', mec='w', mew=5, ms=20)
mpld3.show()

Example Gallery. 참고해서 견본을 보자.

General Functions


fig_to_html()
HTML 로 보낼 수 있다. .즉 당신의 웹페이지에 Embeded  될 수 있다는 야그지.
fig_to_dict()
 JSON 방식으로 내보낼수도있다. SPA 에서 사용하기 좋겠네~
show()
이 함수는 mpld3의 matplotlib의 plt.show 함수와 동일합니다. fig_to_d3 ()을 사용하여 현재 차트를 HTML로 변환하고,이 HTML을 제공하는 로컬 웹 서버를 시작하고, 웹 브라우저에서 이 페이지를 자동으로 엽니다.

Saving Figures to File


save_html()
HTML 파일로 저장 할 수 있으며
save_json()
Json 형식의 파일로도 저장 할 수 있다.




Grafana 플러그인 


그라파나 (Grafana) 설치 및 기본 활용은 다음 글을 이용하세요.

InfluxDB 와 Grafana 를 이용한 빅데이터 가시화 

그라파나의 기본 뷰에서 보다 다양한 뷰를 보여주고 싶은 경우 패널 플러그인 을 활용 할 수 있습니다.
다음 링크로 가시면 다양한 예제를 만날 수 있구요 -> https://grafana.com/plugins

여기서 오늘은 Plotly 플러그인을 추가해 보도록 하겠습니다.



설치하기 

* 참고로 내가 사용한 그라파나는 4.6버전이다.  Plotly 는 3.0의 디펜던시를 가지고 있다.

설치하려는 플러그인에 가보면 Installation 탭이 있고, 거기에 설치 명령어가 적혀져 있다. 

sudo grafana-cli plugins install natel-plotly-panel 

grafana-cli 를 통해 플러그인 설치하고 (복사 후 붙혀 넣는다.) 

sudo service grafana-server restart 

서버 재시작하면 끝


사용하기

    


http://bokeh.pydata.org/en/latest/


Plotly 에 적당한 예제가 없다면, Bokeh 를 알아보자. 둘 다 간단히 python 으로 사용 할 수 있다. 
( 물론 커스터마이징 해서 쓰려면 골치 아프다~~ 직접 만들어 보지 않은 사람에겐 쉬워 보이겠지만)


근데 사실 plotly 나 Bokeh 나 단지 로컬에서 차트를 보는게 목적이라면 matplotlib 를 사용하는게 나을지도 모른다. 하지만 웹에서 서비스 하고 싶을 경우는 즉 Flask 를 이용해서 서버를 구축하고 서버측에서 차트를 Bokek 나 plotly 로 만들어서 HTML 페이지에 임베드 해서 보여주고 싶을 수 있는데 이런 경우를 잠시 알아보자.

(아래는 bokeh 지만 plotly 도 물론 가능하다) 


Rendering Bokeh plots in Flask


 app.py 코드이다. 

import flask

from bokeh.embed import components
from bokeh.plotting import figure
from bokeh.resources import INLINE
from bokeh.util.string import encode_utf8

app = flask.Flask(__name__)

colors = {
'Black': '#000000',
'Red': '#FF0000',
'Green': '#00FF00',
'Blue': '#0000FF',
}

def getitem(obj, item, default):
if item not in obj:
return default
else:
return obj[item]

@app.route("/")
def polynomial():
""" Very simple embedding of a polynomial chart
"""

# Grab the inputs arguments from the URL
args = flask.request.args

# Get all the form arguments in the url with defaults
color = colors[getitem(args, 'color', 'Black')]
_from = int(getitem(args, '_from', 0))
to = int(getitem(args, 'to', 10))

# Create a polynomial line graph with those arguments
x = list(range(_from, to + 1))
fig = figure(title="Polynomial")
fig.line(x, [i ** 2 for i in x], color=color, line_width=2)

js_resources = INLINE.render_js()
css_resources = INLINE.render_css()

script, div = components(fig)
html = flask.render_template(
'index.html',
plot_script=script,
plot_div=div,
js_resources=js_resources,
css_resources=css_resources,
color=color,
_from=_from,
to=to
)
return encode_utf8(html)

if __name__ == "__main__":
print(__doc__)
app.run()


- index.html 템플릿을 통해 랜더링 한후에 UTF8 로 인코딩하여 바로 쏴주고 있다.
- 주요 차트 소스는 plot_div 에 div 로 넣어주고 있으며 
- script 소스 와 js,css 리소스도 넣어 주고 있다.


html 템플릿이다.

<!doctype html>
<html lang="en">
<head>
<meta charset='utf-8' />
<meta http-equiv='content-type' content='text/html; charset=utf-8' />

<title>Embed Demo</title>

{{ js_resources|indent(4)|safe }}

{{ css_resources|indent(4)|safe }}

{{ plot_script|indent(4)|safe }}

</head>
<body>
<!-- A simple form for changing the graph -->
<p> Select your settings: </p>
<form name="color_button" method='GET'>
Color:
<select name="color">
<option value="Red">Red</option>
<option value="Green">Green</option>
<option value="Blue">Blue</option>
<option selected="selected" value="Black">Black</option>
</select>
<br>
From:
<input type="text" name="_from" value="{{ _from }}">
<br>
To:
<input type="text" name="to" value="{{ to }}">
<br>
<button type="submit">Submit</button>
</form>
{{ plot_div|indent(4)|safe }}
<p> Demonstrates some very simple embedding into a webpage</p>
</body>
</html>


자세한 코드와 레퍼런스는 아래를 참고하시라~

https://github.com/realpython/flask-bokeh-example

https://github.com/rpazyaquian/bokeh-flask-tutorial/wiki/Rendering-Bokeh-plots-in-Flask



+ Recent posts