티스토리 뷰
안녕하세요 강정호입니다.
올해 7~8월까지 Cloudwatch API를 사용한 서버 모니터링 시스템을 개발하는 프로젝트를 진행했습니다. 제가 개발한 서버 API 코드에 대해 설명 드릴게요.
서버 모니터링 시스템 개요
기존 AWS Cloudwatch 시스템의 문제점 및 개선방안
Cloudwatch API 연동 1단계 : 인증된 사용자 객체 생성하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public AmazonCloudWatchClient createAmazonCloudWatchClient(String key1, String key2, String endPoint) { /*API CALL을 요청할 사용자 객체 정보입력*/ setKey1(this.key1); //Key1은 Cloudwatch 접속에 필요한 accessKey setKey2(this.key2); //Key2는 Cloudwatch 접속에 필요한 secretKey setEndPoint(this.endPoint); //Endpoint는 원격 서버가 위치한 리전의 엔드포인트 /*BasicAWSCredentials 인증 객체 생성*/ BasicAWSCredentials awsCreds = new BasicAWSCredentials(getKey1(), getKey2()); /*위에서 생성한 인증 객체를 AmazonCloudwatchClient 객체에 주입*/ AmazonCloudWatchClient amazonClient = new AmazonCloudWatchClient(awsCreds); amazonClient.setEndpoint(getEndPoint());// 엔드 포인트 System.out.println("=====AmazonCloudWatchClient 생성 완료========="); return amazonClient; } | cs |
Cloudwatch API 연동을 하기 위해서는 API 콜을 하기 위한 AmazonCloudwatchClient 객체를 생성하는 것이 핵심입니다. 인증된 AmazonCloudwatchClient 객체를 생성하기 위해서는
- 1단계 : AccessKey, SecretKey, Endpoint 입력.
- 2단계 : BasicAWSCredentials 인증 객체 생성
- 3단계 : AmazonCloudwatchClient 객체에 BasicAWSCredentials 인증 객체 주입.
Cloudwatch API 연동 2단계 : Request 객체로 API 호출하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /*Request 객체를 생성하여 request리스트에 추가하는 코드*/ List<GetMetricStatisticsRequest> getMetricStatisticsRequest=new ArrayList<GetMetricStatisticsRequest>(); for(int i=0; i<dimenNameList.size(); i++){ getMetricStatisticsRequest.add( //Dimension이름, Dimension값, 지표 정보 등을 입력하여 Request정보를 생성한다. metricStat.createMetricStatisticsRequest(dimenNameList.get(i), dimenValueList.get(i), metricNamespaceList.get(i))); } /*Cloudwatch로부터 받은 resultList에 관한 코드*/ List<GetMetricStatisticsResult> resultList=new ArrayList<GetMetricStatisticsResult>(); for(int k=0; k<dimenNameList.size(); k++){ System.out.println("매트릭스 request 정보 : "+getMetricStatisticsRequest.get(k).toString()); //생성된 Request정보를 이용하여 Cloudwatch API 콜을 한다. resultList.add(amazonCloudWatchClient.getMetricStatistics(getMetricStatisticsRequest.get(k))); } | cs |
Request 객체를 생성하는 이유?
Cloudwatch API를 호출하기 위해서는 다음과 같은 정보들이 필요하다.
- 디멘션 이름 : 원격 서버가 가지는 이름
- 디멘션 값 : 원격 서버 인스턴스 고유의 ID. 중복되지 않는 유니크한 아이디이다.
- 지표 이름 : API를 통해 응답받을 때 어떤 지표 데이터를 받을 것인가?
- 지표 네임스페이스 : 어떤 원격 서버의 지표를 받을 것인가? AWS/EC2, AWS/RDS 등등.
- 시작 시점, 끝나는 시점 : 시작과 끝나는 시점 사이의 지표를 가져온다.
- 통계 유형
- 단위
위의 정보들을 모두 가지고 있는 것이 Request 객체이다. 이 객체를 이용하여
1 | amazonCloudWatchClient.getMetricStatistics(리퀘스트 객체)); | cs |
Cloudwatch API 연동 3단계 : 응답 받은 객체를 DB에 저장하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /*Result객체의 datapoint를 List<Response>에 넣기*/ //ResponseVO 객체가 1개 만들어질 때마다 insert문 호출 for(int j=0; j<4; j++){ for(int i=0; i<resultList.get(j).getDatapoints().size(); i++){ ResponseVO respVO=new ResponseVO(); respVO.setRespNo(null); //응답의 고유 시퀀스 번호. DB insert 시 자동 발행. respVO.setReqNo(Integer.toString(reqNo)); //Request 객체의 번호 respVO.setMaxVal(Math.round((resultList.get(j).getDatapoints().get(i).getMaximum())*100d)/100d); respVO.setAvgVal(Math.round((resultList.get(j).getDatapoints().get(i).getAverage())*100d)/100d); respVO.setTimeStamp(resultList.get(j).getDatapoints().get(i).getTimestamp()); respVO.setUnit(resultList.get(j).getDatapoints().get(i).getUnit()); respVO.setLabel(resultList.get(j).getLabel()); respVO.setCpuName(reqList.get(j).getCpuName()); dashBoardDAO.insertResponse(respVO); } } | cs |
위와 같이 응답 받은 객체를 for 문을 돌린 후에 insertResponse() 함수를 호출하여 DB에 저장합니다. (컬렉션 insert 참고 링크)
DB에 insert하는 MyBatis 쿼리문은 다음과 같아요.
1 2 3 4 5 6 7 | <insert id="insertResponse" parameterType="responseVO"> <selectKey keyProperty="respNo" resultType="String" order="BEFORE"> select resp_no.nextval from dual </selectKey> INSERT INTO c_response(resp_no, req_no, max_val, avg_val, time_stamp, unit, label, cpu_name) VALUES(#{respNo}, #{reqNo}, #{maxVal},#{avgVal},#{timeStamp}, #{unit}, #{label},#{cpuName}) /insert> | cs |
이상으로 서버 모니터링 시스템을 개발할 때 가장 핵심이었던 Cloudwatch API 연동하는 코드에 대해 소개해 드렸습니다.
'프로젝트' 카테고리의 다른 글
[인하우스키친] 위치 검색시 위치 자동완성 (0) | 2018.11.18 |
---|---|
[인하우스키친] Lazy 로딩으로 인한 JSON 오류 (1) | 2018.11.17 |
[인하우스키친] Ajax로 받아온 값 전역변수에 저장하기 (0) | 2018.11.15 |
[인하우스키친] 지도 위에 마커 보여주기 (1) | 2018.10.28 |
[위치기반 푸드트럭 서비스] 위치 기반 검색기능 코드 (6) | 2018.10.28 |
- Total
- Today
- Yesterday
- 도커
- github
- 파라메터
- 재테크공부
- 열반스쿨기초반
- GIT
- ```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
- resize
- 폭포수
- 항해플러스백엔드
- 항해솔직후기
- front
- pop_back
- 내년은 빡세게!!
- docker
- 항해플러스후기
- 월급쟁이부자들
- 월부닷컴
- 부동산공부
- push_back
- 깃허브
- Use case
- Inception
- 인셉션
- 유즈케이스
- 깃
- Spring boot
- 개발자 회고
- 관계대수
- 2023년
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |