컨테이너 Log 용량 문제 해결하기

도커는 기본적으로 컨테이너 로그 용량 제한이 없어 예상치 못하게 디스크가 꽉차는 경우가 생깁니다.

이번에는 로그를 정리하고 용량 제한을 하는 방법을 알아보겠습니다.  

 


컨테이너 로그 정리하기

 

# 컨테이너 디렉토리 이동
cd /var/lib/docker/containers/<컨테이너ID>

# 기존 로그 정리하기
truncate -s 0 ./*.log

전체 컨테이너 로그 용량 제한

 

daemon.json 파일 생성

nano /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

 

도커 재시작

sudo systemctl restart docker

개별 컨테이너 실행 시 로그 용량 제한

 

도커 옵션으로 설정

docker run -d --name <컨테이너이름> \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  <이미지>

마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

Docker 와 Portainer 설치하기


Docker 설치

sudo apt-get update

sudo apt-get install ca-certificates curl gnupg lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io

docker #sudo 없이 사용

sudo usermod -aG docker <사용자명> # 우분투 사용자명으로 권한 변경 ex) sudo usermod -aG docker root

sudo reboot # 리부팅

 

위와 같이 명령어를 순차적으로 입력하여 Docker를 설치합니다.


Portainer 설치

sudo mkdir -p /data/portainer

docker run --name portainer -p 9000:9000 -d --restart always -v /data/portainer:/data -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ce

 

Docker가 설치 완료되었으면 위 명령어를 사용하여 Portainer도 설치합니다.


Portainer 접속

 

브라우저를 열어서 아래 주소로 Portainer에 접속할 수 있습니다.

http://<Portainer 설치된 IP주소>:9000/

마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

컨테이너 콘솔에 접속하기


컨테이너 ID 또는 컨테이너 이름 조회

docker ps -a

 

먼저 콘솔에 접속하기전에 접속할 컨테이너 정보를 알아야 하기 때문에 위와 같이 명령어를 입력해줍니다.

CONTAINER ID   IMAGE                                     COMMAND                  CREATED       STATUS       PORTS                                                           NAMES
fca9c2189ab1   portainer/portainer-ce                    "/portainer"             2 days ago    Up 2 days    8000/tcp, 9443/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp   portainer

 

그럼 위와 같이 CONTAINER ID 또는 NAMES 항목을 확인할 수 있습니다.


컨테이너 접속하기

docker exec -it fca9c2189ab1 /bin/bash

 

방금전 확인한 정보로 위에 명령어를 사용하여 컨테이너에 접속할 수 있습니다.


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

클래스 구조의 C++ DLL 사용하기

 

이번에는 클래스 구조의 C++ DLL 사용하는 방법을 알아보곘습니다.


DLL 파일 준비하기

 

https://rurustory.com/12

 

[C++] 클래스를 DLL로 만들고 사용하기

클래스를 DLL로 만들고 사용하기 클래스를 DLL로 만들고 사용하는 방법을 알아보겠습니다. 클래스 구조 코드 준비하기 헤더파일(.h파일) #include using std::cout; using std::endl; #include using std::string; class

rurustory.com

 

저는 지난번 포스팅에서 만든 DLL를 사용하여 만들겠습니다.

 

DLL 구조

#include "ctest.h"
#define DLL __declspec(dllexport)

extern "C" {
	DLL TestClass* CreateTestClass();

	DLL void SetString(TestClass* obj, string data);
	DLL void SetBool(TestClass* obj, bool data);
	DLL void SetInt(TestClass* obj, int data);

	DLL string GetString(TestClass* obj);
	DLL bool GetBool(TestClass* obj);
	DLL int GetInt(TestClass* obj);

	DLL void DeleteTestClass(TestClass* obj);
}

DLL 호출하기

 

C#에서는 C++과 다르게 헤더파일(.h)이 필요가 없습니다.

 

DllImport 라는 함수를 사용하여 DLL의 함수를 가져올수 있습니다.

[DllImport("DLL 경로와 파일명")]
사용할 함수();

 


DLL 함수 클래스로 감싸기

 

사실 클래스로 감싸지않고 바로 사용을 할 수도 있지만 나중에 좀 더 사용하기 편하게 DLL를 C# 클래스 형태로 만들어보겠습니다.

 

코드

using System;
using System.Runtime.InteropServices;

namespace DLLTest
{
    class TestClass
    {
        [DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
        static private extern IntPtr CreateTestClass();

        [DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
        static private extern void SetBool(IntPtr obj, bool data);

        [DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
        static private extern void SetInt(IntPtr obj, int data);

        [DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
        static private extern bool GetBool(IntPtr obj);

        [DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
        static private extern int GetInt(IntPtr obj);

        [DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
        static private extern void DeleteTestClass(IntPtr obj);

        private IntPtr obj;

        public TestClass()
        {
            obj = CreateTestClass();
        }

        ~TestClass()
        {
            DeleteTestClass(obj);
        }

        public void SetBool(bool data) { SetBool(obj, data); }
        public void SetInt(int data) { SetInt(obj, data); }

        public bool GetBool() { return GetBool(obj); }
        public int GetInt() { return GetInt(obj); }

    }
}

 

코드 설명

[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
static private extern IntPtr CreateTestClass();

[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
static private extern void SetBool(IntPtr obj, bool data);

[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
static private extern void SetInt(IntPtr obj, int data);

[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
static private extern bool GetBool(IntPtr obj);

[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
static private extern int GetInt(IntPtr obj);

[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
static private extern void DeleteTestClass(IntPtr obj);

 

먼저 DllImport 를 이용하여 DLL의 함수들을 가져옵니다.

C#에서는 IntPtr 를이용하여 C++의 오브젝트 주소를 가져올 수 있습니다.

 

private IntPtr obj;

public TestClass()
{
    obj = CreateTestClass();
}

~TestClass()
{
    DeleteTestClass(obj);
}

 

IntPtr 형태의 obj를 생성하고 생성자에서 C++에서 만들어 놓은 CreateTestClass()를 이용하여 obj에 객체를 생성해줍니다.

그리고 소멸자에 꼭 C++에서 만든 DeleteTestClass()를 이용하여 동적할당을 해제해줍니다.

 

public void SetBool(bool data) { SetBool(obj, data); }
public void SetInt(int data) { SetInt(obj, data); }

public bool GetBool() { return GetBool(obj); }
public int GetInt() { return GetInt(obj); }

 

TestClass의 함수들을 만들어주고 return으로 C++ 의 함수들을 다시 재호출하여 TestClass 함수만 사용해도 C++ 함수들을 사용할 수 있도록 만들어줍니다.


클래스 테스트

 

전체 코드

using System;
using System.Runtime.InteropServices;

namespace DLLTest
{
	class TestClass
	{
		[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
		static private extern IntPtr CreateTestClass();

		[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
		static private extern void SetBool(IntPtr obj, bool data);

		[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
		static private extern void SetInt(IntPtr obj, int data);

		[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
		static private extern bool GetBool(IntPtr obj);

		[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
		static private extern int GetInt(IntPtr obj);

		[DllImport("D:\\C_Project\\ctest\\x64\\Release\\ctest.dll", CallingConvention = CallingConvention.Cdecl)]
		static private extern void DeleteTestClass(IntPtr obj);

		private IntPtr obj;

		public TestClass()
		{
			obj = CreateTestClass();
		}

		~TestClass()
		{
			DeleteTestClass(obj);
		}

		public void SetBool(bool data) { SetBool(obj, data); }
		public void SetInt(int data) { SetInt(obj, data); }

		public bool GetBool() { return GetBool(obj); }
		public int GetInt() { return GetInt(obj); }

	}

	class test
	{
		static void Main(string[] args)
		{
			TestClass lib = new TestClass();

			lib.SetBool(true);
			lib.SetInt(200);

			Console.WriteLine("[GetBool] " + lib.GetBool());
			Console.WriteLine("[GetInt] " + lib.GetInt());
		}
	}
}

 

이제 우리가 아는 클래스 형태로 C++의 DLL를 사용할 수 있습니다.

 

실행 결과


마무리

 

추가로 C++ 문자열을 C#에서 쓰는게 조금 복잡해서 따로 포스팅을 하였습니다.

궁금하신 분들은 아래 링크에서 확인 할 수 있습니다!

 

https://rurustory.com/1

 

[C#] 다양한 방법으로 C++ DLL String 사용하기

다양한 방법으로 C++ DLL String 사용하기 C#에서 C++로 문자열을 전달을 해줄때 자동으로 데이터를 맞춰주지만 C++에서 C#으로 문자열을 전달 할때는 수동으로 데이터를 맞춰야 합니다. 지금부터 다

rurustory.com

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

'프로그래밍 > C#' 카테고리의 다른 글

[C#] 다양한 방법으로 C++ DLL String 사용하기  (0) 2024.02.21

 

ERROR 3140 (22032): Invalid JSON text: "The document root must not be followed by other values." at position 150 in value for column '컬럼명'.


에러 환경

 

Client OS: Windows10

Server OS: Ubuntu 22.04.2 LTS

MySQL: 8.0.30


에러 원인

 

'컬럼명'의 150번째 위치에서 Json 문법이 잘못되었을때 발생합니다.


해결 방안

 

잘못된 Json 문법을 수정합니다.

 

잘못된 유형

 

1. 따옴표 누락

# 에러
{ "name:  "ruru" }

# 정상
{ "name": "ruru" }

 

2. 배열일 경우 대괄호 누락

#에러
{ "name": "ruru" }, { "name": "baba" }

# 정상
[{ "name": "ruru" }, { "name": "baba" }]

 

3. 배열일 경우 콤마 누락

# 에러 1
[{ "name": "ruru" } { "name": "baba" }]
# 에러 2
{ "name": [ "ruru" "baba" ] }

# 정상 1
[{ "name": "ruru" }, { "name": "baba" }]
# 정상 2
{ "name": [ "ruru", "baba" ] }

 

4. Json 중괄호 누락

# 에러
{ "name": "ruru"
# 정상
{ "name": "ruru" }

등등 여러가지 이유로 에러가 날 수 있습니다.


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

IP2Location 이용하여 IP 위도, 경도, 국가, 주소 확인하기

 

IP2Location에서 제공하는 무료 데이터베이스를 이용하여 IP 위도, 경도, 국가, 주소등 지도 위치를 확인하는 방법에 대해 알아보겠습니다.


IP2Location 장점과 단점

 

일단 가장큰 장점은 무료이면서 데이터베이스를 이용하는 것이기 때문에 검색하는데 횟수 제한이 없다는 점입니다.

하지만 데이터베이스 전체 가지고 있어야해서 그만큼 용량을 확보해야한다는 단점이 있습니다.


데이터베이스 준비하기

 

https://lite.ip2location.com/ip2location-lite

 

IP2Location LITE Database

IP2Location LITE geolocation database provides geographical information of an IP address such as the country, city, region, latitude, longitude, and much more.

lite.ip2location.com

 

위 링크에 들어가서 원하는 데이터베이스를 선택하면 Format이 BIN과 CSV 두가지가 있는데 원하는 IP 형식의 BIN파일을 다운로드 합니다.

 


IP2Location 라이브러리 설치하기

pip install IP2Location

 

pip를 이용하여 라이브러리를 설치합니다.


IP2Location 라이브러리 사용하기

 

import IP2Location, os

ip2location_db = IP2Location.IP2Location(os.path.join("BIN파일 폴더경로", "BIN파일 이름"))
#ip2location_db = IP2Location.IP2Location(os.path.join("/home/user/db", "IP-COUNTRY-REGION-CITY-LATITUDE-LONGITUDE-ZIPCODE-TIMEZONE-ISP-DOMAIN-NETSPEED-AREACODE-WEATHER-MOBILE-ELEVATION-USAGETYPE-ADDRESSTYPE-CATEGORY-DISTRICT-ASN-SAMPLE.BIN"))
data = ip2location_db.get_all("19.5.10.1")

print("Country Code          : " + data.country_short)
print("Country Name          : " + data.country_long)
print("Region Name           : " + data.region)
print("City Name             : " + data.city)
print("ISP Name              : " + data.isp)
print("Latitude              : " + data.latitude)
print("Longitude             : " + data.longitude)
print("Domain Name           : " + data.domain)
print("ZIP Code              : " + data.zipcode)
print("Time Zone             : " + data.timezone)
print("Net Speed             : " + data.netspeed)
print("Area Code             : " + data.idd_code)
print("IDD Code              : " + data.area_code)
print("Weather Station Code  : " + data.weather_code)
print("Weather Station Name  : " + data.weather_name)
print("MCC                   : " + data.mcc)
print("MNC                   : " + data.mnc)
print("Mobile Carrier        : " + data.mobile_brand)
print("Elevation             : " + data.elevation)
print("Usage Type            : " + data.usage_type)
print("Address Type          : " + data.address_type)
print("Category              : " + data.category)
print("District              : " + data.district)
print("ASN                   : " + data.asn)
print("AS                    : " + data.as_name)

 

위와 같이 다운로드한 BIN 파일을 메모리에 불러와 사용할 수 있습니다.


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

테이블 최근 수정일, 갱신일 확인

 

이번에는 테이블 마지막 업데이트 시간을 알고 싶을때 사용하는 방법에 대해 알아보겠습니다.


주의사항

 

MySQL 5.7버전 이하에는 InnoDB에 버그가 있어 정상적으로 UPDATE_TIME을 불러올수 없는 이슈가 있습니다.

또한 서버가 다시 시작되거나 테이블이 InnoDB 데이터 사전 캐시에서 제거되면 타임스탬프가 유지되지 않아 정상적으로 사용할 수 없습니다.

 

그래서 방법3에 직접 시간을 관리하는 방법도 같이 서술해놓겠습니다.


방법1. SHOW TABLE STATUS

 

SHOW TABLE STATUS LIKE '테이블명';
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| Name       | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation          | Checksum | Create_options | Comment |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| test       | InnoDB |      10 | Dynamic    |    1 |          16384 |       16384 |               0 |            0 |         0 |           NULL | 2024-03-27 09:38:55 | 2024-03-27 09:39:05 | NULL       | utf8mb4_unicode_ci |     NULL |                |         |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+

 


방법2. INFORMATION_SCHEMA.TABLES

 

DB명과 테이블명으로 확인

SELECT UPDATE_TIME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DB명'
	AND TABLE_NAME = '테이블명';
+---------------------+
| UPDATE_TIME         |
+---------------------+
| 2024-03-27 09:39:05 |
+---------------------+

 

테이블명으로 확인

SELECT UPDATE_TIME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME='테이블명';
+---------------------+
| UPDATE_TIME         |
+---------------------+
| 2024-03-27 09:39:05 |
+---------------------+

방법3. 직접 업데이트 시간 관리하기

 

CREATE TABLE test (
	id INT PRIMARY KEY,
	name CHAR(4),
	update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
			ON UPDATE CURRENT_TIMESTAMP,
	KEY (update_time)
);

 

테스트 테이블 test가 생성하겠습니다.

test에는 id와 name, 업데이트 시간을 관리하는 update_time 컬럼이 있습니다.

 

INSERT INTO test(id, update_time) VALUES (1, NOW());

SELECT * FROM test;
+----+------+---------------------+
| id | name | update_time         |
+----+------+---------------------+
|  1 | NULL | 2024-03-28 09:47:24 |
+----+------+---------------------+

 

위와같이 데이터를 넣으며 update_time을 관리해줍니다.

 

UPDATE test SET name = 'test' WHERE id = 1;

SELECT * FROM test;
+----+------+---------------------+
| id | name | update_time         |
+----+------+---------------------+
|  1 | test | 2024-03-28 09:50:22 |
+----+------+---------------------+

  

UPDATE를 하면 자동으로 update_time이 갱신됩니다.

 

SELECT MAX(update_time) FROM test;
+---------------------+
| MAX(update_time)    |
+---------------------+
| 2024-03-28 09:50:22 |
+---------------------+

 

테이블의 마지막 업데이트 시간을 보고싶으면 MAX 함수를 사용하여 확인할 수 있습니다.


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

ERROR 1317 (70100): Query execution was interrupted


에러 환경

 

Client OS: Windows10

Server OS: Ubuntu 22.04.2 LTS

MySQL: 8.0.30


에러 원인

 

쿼리 처리시간이 너무 오래걸리거나 서버에 이상이 있어 쿼리를 정상적으로 실행을 할수없을 때 나타나는 에러입니다.


해결 방안

 

방법1.

MySQL 서버를 재시작합니다. 그리고 해결되었는지 확인합니다.

 

방법2.

SELECT 를 하거나 INSERT, UPDATE를 할 때 인덱스 사용유무에 따라 실행속도를 향상시킬수 있습니다.

# 인덱스 활성화
ALTER TABLE 테이블명 ENABLE KEYS;

# 인덱스 비활성화
ALTER TABLE 테이블명 DISABLE KEYS;

 

방법3.

max_allowed_packet는 서버와 클라이언트 사이에 주고받는 패킷의 사이즈를 설정하는 값으로 사이즈를 늘려 속도를 향상시킬 수 있습니다.

# max_allowed_packet 사이즈 확인
SHOW VARIABLES WHERE variable_name = 'max_allowed_packet';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 67108864 |
+--------------------+----------+

# max_allowed_packet 사이즈 변경 ex)64Mb
SET GLOBAL max_allowed_packet = 64*1024*1024;

 

또는 my.ini 파일을 통해서도 변경할 수 있습니다.


마무리

 

공통적으로 해결할 수 있는 방법을 작성해보았습니다. 이외에도 연산시간이 오래걸리거나 루프가 너무 많아 오래걸리는 쿼리문같은 경우 적절한 수정을 통해 해결하면 좋을 것 같습니다.

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

ERROR 1062 (23000): Duplicate entry '' for key 'PRIMARY'


에러 원인

 

INSERT 또는 UPDATE 할 때 중복된 PK값이 있을 때 발생합니다.


해결 방안

 

중복된 값이 있는지 확인하고 다시 작업을 합니다.

SELECT * FROM 테이블
WHERE 컬럼명 = '중복 체크 값'

 


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

 

시계열 데이터 일정 간격 집계

 

엘라스틱서치 시계열데이터 날짜별, 시간별 등 기준 일정 간격으로 집계하는법을 알아봅시다.


달력기준 일정 간격 집계

GET [인덱스]/_search
{
    "query": {
        "match_all": {}
	},
	"size": 0,
	"aggs": {
		"my_buckets": {
			"date_histogram": {
				"field": "timetmp",
				"calendar_interval": "month",
				"format": "yyyy-MM"         
			}
		}
	}
}

 

my_buckets: 버켓 이름

field: 간격을 측정할 필드

format: 날짜 포맷

calendar_interval: 달력 간격

minute, 1m
hour, 1h
day, 1d
week, 1w
month, 1M
quarter, 1q 분기
year, 1y

 


시간기준 일정 간격 집계

GET [인덱스]/_search
{
    "query": {
        "match_all": {}
	},
	"size": 0,
	"aggs": {
		"my_buckets": {
			"date_histogram": {
				"field": "timetmp",
				"fixed_interval": "1h",
				"format": "yyyy-MM-dd/hh:mm:ss"
			}
		}
	}
}

 

my_buckets: 버켓 이름

field: 간격을 측정할 필드

format: 날짜 포맷

fixed_interval : 시간 간격

ms 밀리초
s
m
h
d

일정 간격 데이터 통계

GET [인덱스]/_search
{
    "query": {
        "match_all": {}
	},
	"size": 0,
	"aggs": {
		"my_buckets": {
			"date_histogram": {
				"field": "timetmp",
				"fixed_interval": "1h",
				"format": "yyyy-MM-dd/hh:mm:ss"         
			},
			"aggs":{
				"data_sum":{
					"sum" : { "field": "egg" }
				}
			}
		}
	}
}

 

각각의 date_histogram 데이터를 통계내고 싶으면 위와 같이 aggs 를 이용하여  통계낼수 있습니다.

 


기타

GET [인덱스]/_search
{
    "query": {
        "match_all": {}
	},
	"size": 0,
	"aggs": {
		"my_buckets": {
			"date_histogram": {
				"field": "timetmp",
				"fixed_interval": "6h",
				"extended_bounds": {
					"min": "2024-03-26T00:00:00"
					"max": "2024-03-26T23:59:59"
				}
			}
		}
	}
}

 

extended_bounds 를 이용하여 histogram 범위를 확장하면 중간에 Null값으로 인해 표시되지 않는 데이터도 표시할 수 있습니다.

 

extended_bounds 적용 전 데이터

"buckets":
[
    {
        "key_as_string": "2024-03-26T00:00:00.000Z",
        "key": 1711411200000,
        "doc_count": 4245
    },
    {
        "key_as_string": "2024-03-26T12:00:00.000Z",
        "key": 1711454400000,
        "doc_count": 1862
    }
]

 

extended_bounds 적용 후 데이터

"buckets":
[
    {
        "key_as_string": "2024-03-26T00:00:00.000Z",
        "key": 1711411200000,
        "doc_count": 4245
    },
    {
        "key_as_string": "2024-03-26T06:00:00.000Z",
        "key": 1711432800000,
        "doc_count": 0
    },
    {
        "key_as_string": "2024-03-26T12:00:00.000Z",
        "key": 1711454400000,
        "doc_count": 1862
    },
    {
        "key_as_string": "2024-03-26T18:00:00.000Z",
        "key": 1711476000000,
        "doc_count": 0
    }
]

마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

 

 

728x90
반응형

'프로그래밍 > Elasticsearch' 카테고리의 다른 글

[Elasticsearch] 엘라스틱서치 명령어 모음  (0) 2024.02.23

+ Recent posts