Agent 데이타 수집을 통한 Application Monitoring Service 개요)
1. Agent 데이타 수집
1.1.CPU(Central Processing Unit) % Processor Time: CPU 사용률의 총합을 나타내며, 특정 프로세서의 사용률을 모니터링하는 데 유용합니다. Processor Queue Length: 실행 대기 중인 프로세스 또는 스레드 수를 나타냅니다. 이 값이 지속적으로 높으면 CPU 병목 가능성이 있습니다. 1.2. 메모리 (Memory) Available MBytes: 사용 가능한 메모리 용량으로, 메모리 부족 상태를 파악하는 데 중요합니다. Pages/sec: 메모리 페이지가 디스크에 읽기/쓰기된 횟수입니다. 이 값이 높다면 메모리 부족을 나타낼 수 있습니다. Cache Bytes: 시스템의 캐시 메모리 크기를 나타냅니다. 일반적으로 캐시 메모리가 많을수록 시스템 성능이 향상됩니다. 1.3. 디스크 (Disk) % Disk Time: 디스크가 사용 중인 비율을 보여줍니다. 디스크가 과도하게 사용 중일 경우 I/O 병목 현상이 발생할 수 있습니다. Disk Bytes/sec: 초당 디스크에서 읽기 및 쓰기된 바이트 수를 측정합니다. 디스크 성능과 처리량을 파악하는 데 유용합니다. Avg. Disk Queue Length: 디스크 요청 큐의 평균 길이입니다. 이 값이 높으면 디스크가 과도하게 사용 중일 가능성이 있습니다. 1.4. 네트워크 (Network) Bytes Total/sec: 네트워크 인터페이스를 통해 초당 전송된 총 바이트 수입니다. 네트워크 사용률을 파악하는 데 유용합니다. Packets/sec: 초당 전송된 패킷 수로, 네트워크 연결 상태를 확인하는 데 유용합니다. Output Queue Length: 네트워크 인터페이스 대기열의 길이로, 이 값이 높으면 네트워크 병목이 발생할 가능성이 있습니다. 1.5. 시스템 (System) System Up Time: 시스템이 부팅된 후 경과한 시간입니다. Context Switches/sec: 초당 발생하는 문맥 교환 수로, 많은 문맥 교환은 시스템 부하가 크다는 신호일 수 있습니다. Processes: 현재 실행 중인 프로세스 수로, 과도한 프로세스 실행이 성능 저하를 유발할 수 있습니다. 1.6. 특정 프로세스 (Process-Specific) 특정 애플리케이션의 성능을 모니터링할 때 유용합니다. % Processor Time (for a specific process): 특정 프로세스의 CPU 사용률을 나타냅니다. Private Bytes: 특정 프로세스가 사용하는 비공유 메모리 크기입니다. Handle Count: 특정 프로세스가 사용하는 핸들 수를 나타내며, 핸들 누수 여부를 확인할 수 있습니다. 1.7. GPU (Graphics Processing Unit) -(Windows 10 이상) GPU 사용량은 그래픽이 많이 사용되는 애플리케이션이나 게임의 성능을 모니터링할 때 유용합니다. GPU Engine Usage: 각 GPU 엔진의 사용량을 보여줍니다. Dedicated/Shared GPU Memory Usage: GPU에서 사용하는 전용 및 공유 메모리 양입니다.
2. Redis를 통한 Application.Monitoring.Service.DB에 저장
Node.js를 통한 Redis 실시간 데이타+조회(+로그인) - Redis Search & RealTime Push(Exture3.0 Stock) - Kse 추가 - Kosdaq 추가 - Elw,Etn,Etf 추가
1. 첫화면에서 로그인한다. 2. 로그인정보는 현재 클라이언트의 정보를 서버에 보낸다. 3. 서버에 정보를 보내면서, 동시에 Redis에 접속해서, 실시간데이타를 받아로도록 한다. // Function to fetch data from Redis list using BLPOP (blocking pop) async function fetchDataFromRedis() { console.error('fetchDataFromRedis entered:[' + redisPublicKey + ']');
try { const result = await redisClient.blPop(`QCS:${redisPublicKey}`, 0); // redisPublicKey 사용 if (result) { const data = JSON.parse(result.element); return Array.isArray(data) ? data : [data]; // Ensure data is an array } } catch (err) { console.error('Error fetching data from Redis:', err); } return []; }
// Polling Redis every second and sending data to WebSocket clients setInterval(async () => { if (redisClient && redisPublicKey && redisPublicKey.length >= 4) { // Redis 클라이언트 연결 여부 체크 const processedData = await fetchDataFromRedis(); console.log('Sending data:', processedData); // Log the data being sent connectedClients.forEach((client) => { if (client.readyState === client.OPEN) { client.send(JSON.stringify(processedData)); } }); } }, 1000); // 1 second interval // Redis Public Key 설정 엔드포인트 app.post('/set-public-key', async (req, res) => { const { publicKey } = req.body;
if (publicKey) { redisPublicKey = publicKey; // publicKey 업데이트 console.log('Redis Public Key updated to:', redisPublicKey); await connectToRedis(); // Redis에 연결 시도(로그인시에) res.json({ message: 'Public Key updated successfully.' }); } else { res.status(400).json({ error: 'Public Key is required.' }); } });
로그인후에 Node.js에서 Redis에 접속을 시도한다.)
- NODE.SERVER - REDIS.TICKER.SERVER - 실시간 PUSH & 조회
WireGuard VPN에서 PrivateKey와 PublicKey는 VPN 연결을 보안하고 암호화하는 데 중요한 역할을 합니다. 이 두 키는 비대칭 암호화 방식을 따르며, 각 역할은 다음과 같습니다.
1. PrivateKey (개인 키) PrivateKey는 각 클라이언트 또는 서버가 비밀로 유지해야 하는 개인 키입니다. 이 키는 외부에 노출되지 않아야 하며, 오직 해당 장치에서만 사용됩니다. 암호화와 서명: 이 키를 사용하여 데이터를 암호화하거나 서명할 수 있습니다. PrivateKey로 암호화된 데이터는 해당 PrivateKey와 짝을 이루는 **PublicKey(공개 키)**로만 복호화할 수 있습니다. WireGuard 설정: WireGuard 설정 파일에서 PrivateKey 항목에 개인 키가 포함됩니다. 이 키는 VPN 터널을 설정하는 데 사용됩니다.
2. PublicKey (공개 키) PublicKey는 각 장치의 공개된 키로, 다른 장치들이 이 키를 사용해 해당 장치로 안전하게 통신할 수 있도록 합니다. 공유: PublicKey는 클라이언트와 서버 간에 공유됩니다. 즉, 연결하려는 다른 장치에 이 공개 키를 제공하여 암호화된 데이터를 주고받을 수 있습니다.
WireGuard 설정: WireGuard 설정 파일에서 PublicKey는 각 피어(peer, 즉 통신 상대)의 공개 키를 나타냅니다. 이는 해당 피어와의 통신을 암호화하고 보장하는 역할을 합니다.
동작 방식
키 생성: 각 장치는 고유한 PrivateKey와 PublicKey 쌍을 생성합니다.
PublicKey 교환: 클라이언트와 서버는 서로의 PublicKey를 공유하여 암호화된 통신을 설정합니다.
데이터 암호화: 클라이언트는 서버의 PublicKey를 사용해 데이터를 암호화하고, 서버는 자신의 PrivateKey를 사용해 이 데이터를 복호화합니다. 반대로 서버도 클라이언트의 PublicKey로 데이터를 암호화하고 클라이언트는 자신의 PrivateKey로 복호화합니다. 이렇게 PublicKey와 PrivateKey는 WireGuard VPN에서 데이터의 기밀성, 무결성 및 인증을 보장하는 핵심 요소로 작동합니다.
sudo apt update Node.js 설치: Node.js는 여러 방법으로 설치할 수 있지만, 가장 간편한 방법은 NodeSource PPA를 사용하는 것입니다. 다음 명령어를 실행하여 Node.js를 설치합니다.
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt install -y nodejs 위 명령어에서 setup_18.x는 Node.js의 최신 LTS 버전을 설치합니다. 다른 버전이 필요하다면, 해당 버전의 번호로 변경하세요.
설치 확인: 설치가 완료되면 Node.js와 npm(노드 패키지 관리자)이 제대로 설치되었는지 확인합니다.
node -v npm -v 이제 Node.js와 npm이 정상적으로 설치되었습니다. 필요한 패키지를 설치하거나 프로젝트를 시작할 수 있습니다!
sudo ufw status sudo ufw allow 3000 sudo ufw status sudo ufw enable
sudo ufw allow 8080 sudo ufw status sudo ufw enable
app.js 수정부분)
app.listen(port, '0.0.0.0', () => { console.log(`HTTP Server is running at http://0.0.0.0:${port}`); }); const wss = new WebSocketServer({ port: 8080, host: '0.0.0.0' }); 위의 수정으로 WebSocketServer도 모든 인터페이스에서 접속을 허용하게 됩니다.
index.html 수정부분)
<script> // ... (이전 코드)
const ws = new WebSocket('ws://192.168.45.54:8080'); // 수정된 부분
// ... (이후 코드) </script> 이제 수정한 코드를 사용하여 index.html을 테스트해 보세요. 추가적인 질문이 있으면 언제든지 말씀해 주세요!