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 & 조회