KX Community

Find answers, ask questions, and connect with our KX Community around the world.
KX Community Guidelines

Home Forums kdb+ Creating heartbeat monitor for server-client

  • Creating heartbeat monitor for server-client

    Posted by ngumbo on March 4, 2022 at 12:00 am

    What would be the way of going about creating a heartbeat table server side to monitor response times to each of the servers clients. I have been exploring this but am unsure on how to send a message from server to client and only know how to do client to server messages. To measure response time I can use a timer just unsure on how to go about sending the message?

    ngumbo replied 3 months, 2 weeks ago 2 Members · 3 Replies
  • 3 Replies
  • pmallon

    Member
    March 4, 2022 at 12:00 am

    Hi,

    Is there a specific reason for server>client?

    I have tried to cover both below, hopefully it is at least a starter for you and helps..

    q)/server process
    q)p 50001
    q)/ heartbeat table to log hbs
    q)heartbeat:([host:`$();port:`long$()];hdl:`int$();lastPing:`timestamp$();pings:`long$())
    q)/function to log hearbeat on server
    q)registerHeartBeat:{[hst;prt] `heartbeat upsert (hst;prt;.z.w;.z.p;)1+0^first exec pings from heartbeat where host=hst,port=prt }

     

    q)/client process
    q)p 50000
    q)/ hdl to server
    q).R.Server:hopen `::50001
    q)/ send heartbeat from client to server
    q)sendHeartBeat:{ .R.Server (`registerHeartBeat;.z.h;system "p")}
    q)/ call send a heart beat from client to server
    q)sendHeartBeat[] / this could be on a timer
    `heartbeat
    
    // check on the server 
    q)heartbeat
    host port | hdl lastPing pings
    ---------------------| ---------------------------------------
    desktop 50000| 9 2022.03.04D12:31:48.583133000 1

     

    / initiating from server side
    / have each client process register with the server on startup (for this I have just manually called sendHeartBeat from client) 
    / to add hdls to heartbeat table
    
    q)/ callback type idea to initiate a registerHeartBeat call
    q)reportToServer:{ .z.w (`registerHeartBeat;.z.h;system "p")}
    q)/ this function on server would request a heart beat from each hdl in the heartbeat table
    q)getHeartBeatFromServer:{ (exec distinct hdl from heartbeat)@:(reportToServer;`)}
    q)/ call above function, which could be on a timer
    q)getHeartBeatFromServer[]
    ,`heartbeat
    q)heartbeat
    host port | hdl lastPing pings
    ---------------------| ---------------------------------------
    desktop 50000| 9 2022.03.04D12:33:28.583133000 2
    
    
    

    Thanks

     

  • ngumbo

    Member
    March 7, 2022 at 12:00 am

    Hey Patrick, thanks again for the detailed response its much appreciated, I believe it is requested to be done server side so no setup has to be done client side regardless of which clients are connecting in.

  • pmallon

    Member
    March 7, 2022 at 12:00 am

    Yea Ok, that’s a fair point.  In that case hopefully the 2nd point above helps get you started… if not let me know.

    thanks

Log in to reply.