• zhaozhao.zz's avatar
    Add metrics for WATCH (#12966) · 50d6fe8c
    zhaozhao.zz authored
    Redis has some special commands that mark the client's state, such as
    `subscribe` and `blpop`, which mark the client as `CLIENT_PUBSUB` or
    `CLIENT_BLOCKED`, and we have metrics for the special use cases.
    
    However, there are also other special commands, like `WATCH`, which
    although do not have a specific flags, and should also be considered
    stateful client types. For stateful clients, in many scenarios, the
    connections cannot be shared in "connection pool", meaning connection
    pool cannot be used. For example, whenever the `WATCH` command is
    executed, a new connection is required to put the client into the "watch
    state" because the watched keys are stored in the client.
    
    If different business logic requires watching different keys, separate
    connections must be used; otherwise, there will be contamination. This
    also means that if a user's business heavily relies on the `WATCH`
    command, a large number of connections will be required.
    
    Recently we have encountered this situation in our platform, where some
    users consume a significant number of connections when using Redis
    because of `WATCH`.
    
    I hope we can have a way to observe these special use cases and special
    client connections. Here I add a few monitoring metrics:
    
    1. `watching_clients` in `INFO` reply: The number of clients currently
    in the "watching" state.
    2. `total_watched_keys` in `INFO` reply: The total number of keys being
    watched.
    3. `watch` in `CLIENT LIST` reply: The number of keys each client is
    currently watching.
    50d6fe8c
server.h 180 KB