package nsqd

import (
    "sort"
    "sync/atomic"

    "github.com/nsqio/nsq/internal/quantile"
)

type TopicStats struct {
    TopicName    string         `json:"topic_name"`
    Channels     []ChannelStats `json:"channels"`
    Depth        int64          `json:"depth"`
    BackendDepth int64          `json:"backend_depth"`
    MessageCount uint64         `json:"message_count"`
    Paused       bool           `json:"paused"`

    E2eProcessingLatency *quantile.Result `json:"e2e_processing_latency"`
}

func NewTopicStats(t *Topic, channels []ChannelStats) TopicStats {
    return TopicStats{
        TopicName:    t.name,
        Channels:     channels,
        Depth:        t.Depth(),
        BackendDepth: t.backend.Depth(),
        MessageCount: atomic.LoadUint64(&t.messageCount),
        Paused:       t.IsPaused(),

        E2eProcessingLatency: t.AggregateChannelE2eProcessingLatency().Result(),
    }
}

type ChannelStats struct {
    ChannelName   string        `json:"channel_name"`
    Depth         int64         `json:"depth"`
    BackendDepth  int64         `json:"backend_depth"`
    InFlightCount int           `json:"in_flight_count"`
    DeferredCount int           `json:"deferred_count"`
    MessageCount  uint64        `json:"message_count"`
    RequeueCount  uint64        `json:"requeue_count"`
    TimeoutCount  uint64        `json:"timeout_count"`
    Clients       []ClientStats `json:"clients"`
    Paused        bool          `json:"paused"`

    E2eProcessingLatency *quantile.Result `json:"e2e_processing_latency"`
}

func NewChannelStats(c *Channel, clients []ClientStats) ChannelStats {
    return ChannelStats{
        ChannelName:   c.name,
        Depth:         c.Depth(),
        BackendDepth:  c.backend.Depth(),
        InFlightCount: len(c.inFlightMessages),
        DeferredCount: len(c.deferredMessages),
        MessageCount:  atomic.LoadUint64(&c.messageCount),
        RequeueCount:  atomic.LoadUint64(&c.requeueCount),
        TimeoutCount:  atomic.LoadUint64(&c.timeoutCount),
        Clients:       clients,
        Paused:        c.IsPaused(),

        E2eProcessingLatency: c.e2eProcessingLatencyStream.Result(),
    }
}

type ClientStats struct {
    // TODO: deprecated, remove in 1.0
    Name string `json:"name"`

    ClientID        string `json:"client_id"`
    Hostname        string `json:"hostname"`
    Version         string `json:"version"`
    RemoteAddress   string `json:"remote_address"`
    State           int32  `json:"state"`
    ReadyCount      int64  `json:"ready_count"`
    InFlightCount   int64  `json:"in_flight_count"`
    MessageCount    uint64 `json:"message_count"`
    FinishCount     uint64 `json:"finish_count"`
    RequeueCount    uint64 `json:"requeue_count"`
    ConnectTime     int64  `json:"connect_ts"`
    SampleRate      int32  `json:"sample_rate"`
    Deflate         bool   `json:"deflate"`
    Snappy          bool   `json:"snappy"`
    UserAgent       string `json:"user_agent"`
    Authed          bool   `json:"authed,omitempty"`
    AuthIdentity    string `json:"auth_identity,omitempty"`
    AuthIdentityURL string `json:"auth_identity_url,omitempty"`

    TLS                           bool   `json:"tls"`
    CipherSuite                   string `json:"tls_cipher_suite"`
    TLSVersion                    string `json:"tls_version"`
    TLSNegotiatedProtocol         string `json:"tls_negotiated_protocol"`
    TLSNegotiatedProtocolIsMutual bool   `json:"tls_negotiated_protocol_is_mutual"`
}

type Topics []*Topic

func (t Topics) Len() int      { return len(t) }
func (t Topics) Swap(i, j int) { t[i], t[j] = t[j], t[i] }

type TopicsByName struct {
    Topics
}

func (t TopicsByName) Less(i, j int) bool { return t.Topics[i].name < t.Topics[j].name }

type Channels []*Channel

func (c Channels) Len() int      { return len(c) }
func (c Channels) Swap(i, j int) { c[i], c[j] = c[j], c[i] }

type ChannelsByName struct {
    Channels
}

func (c ChannelsByName) Less(i, j int) bool { return c.Channels[i].name < c.Channels[j].name }

func (n *NSQD) GetStats() []TopicStats {
    n.RLock()
    realTopics := make([]*Topic, 0, len(n.topicMap))
    for _, t := range n.topicMap {
        realTopics = append(realTopics, t)
    }
    n.RUnlock()
    sort.Sort(TopicsByName{realTopics})
    topics := make([]TopicStats, 0, len(realTopics))
    for _, t := range realTopics {
        t.RLock()
        realChannels := make([]*Channel, 0, len(t.channelMap))
        for _, c := range t.channelMap {
            realChannels = append(realChannels, c)
        }
        t.RUnlock()
        sort.Sort(ChannelsByName{realChannels})
        channels := make([]ChannelStats, 0, len(realChannels))
        for _, c := range realChannels {
            c.RLock()
            clients := make([]ClientStats, 0, len(c.clients))
            for _, client := range c.clients {
                clients = append(clients, client.Stats())
            }
            c.RUnlock()
            channels = append(channels, NewChannelStats(c, clients))
        }
        topics = append(topics, NewTopicStats(t, channels))
    }
    return topics
}

stats.go的更多相关文章

  1. [转] MemCached 的 stats 命令

    Memcached有个stats命令,通过它可以查看Memcached服务的许多状态信息.使用方法如下:先在命令行直接输入telnet 主机名端口号,连接到memcached服务器,然后再连接成功后, ...

  2. [原创博文] 用Python做统计分析 (Scipy.stats的文档)

    [转自] 用Python做统计分析 (Scipy.stats的文档) 对scipy.stats的详细介绍: 这个文档说了以下内容,对python如何做统计分析感兴趣的人可以看看,毕竟Python的库也 ...

  3. Process Stats:了解你的APP如何使用内存(转)

    原文地址:http://android-developers.blogspot.com/2014/01/process-stats-understanding-how-your.html?m=1 原作 ...

  4. Unity 5 Stats窗口

    Unity5的 Statistics上的统计信息和Unity4 有一些区别, Statistics窗口,全称叫做 Rendering Statistics Window,即渲染统计窗口(或渲染数据统计 ...

  5. memcached实战系列(四)memcached stats命令 memcached优化

    memcached提供一系列的命令进行优化的查看,方便我们调整我们的存储策略,查看我们的使用率,内存的使用率以及浪费情况.常用的命令有stats.stats settings.stats items. ...

  6. x264 n-th pass编码时候Stats文件的含义

    x264 n-th pass(一般是2pass)编码时所用的文件包括下述x264参数生成.stats文件 options: 1280x816 fps=2997/125 timebase=125/299 ...

  7. Scipy教程 - 统计函数库scipy.stats

    http://blog.csdn.net/pipisorry/article/details/49515215 统计函数Statistical functions(scipy.stats) Pytho ...

  8. dat.gui stats.js 通用参数配置及图像统计工具

    在网上看到了一个非常好的JS烟雾效果 https://paveldogreat.github.io/WebGL-Fluid-Simulation/看源码时发现了dat.gui很好用. dat.gui ...

  9. scipy.stats.multivariate_normal的使用

    参考:https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.multivariate_normal.html ...

随机推荐

  1. 如何在Eclipse CDT中编译含有多个main函数的项目

    最近在杭电ACM上做题,使用的C++工具是Eclipse,但是Eclipse CDT不能同时存在多个main函数的文件,上网也搜了很多资料,但是按他们的步骤来,还是不能实现自己想要的效果.经过一下午的 ...

  2. 和菜鸟一起学linux之initramfs方式启动

    关于initramfs initramfs在编译内核的同时被编译并与内核连接成一个文件,它被链接到地址__initramfs_start处,与内核同时被加载到ram中.initramfs被解析处理后原 ...

  3. Dubbo性能调优参数及原理

    本文是针对 Dubbo 协议调用的调优指导,详细说明常用调优参数的作用域及源码. Dubbo调用模型 常用性能调优参数 参数名 作用范围 默认值 说明 备注 threads provider 200 ...

  4. Spring Boot通过命令行启动发生FileNotFoundException

    Spring Boot + Jersey 通过命令行启动会发生错误FileNotFoundException异常 异常信息如下: ERROR o.a.c.c.C.[Tomcat].[localhost ...

  5. IT轮子系列(一)——DropDownList 的绑定,你秒懂了吗

    前言 最近猛然惊觉(说是猛然,是因为自己工作那么多年,居然不自知.不反省),在开发中,自己碰到一些常用的功能代码块,还是习惯性的baidu,然后copy....这样的操作,不知自己重复了多少遍.现在回 ...

  6. oracle索引建立和删除

    1.多列建立索引 SQL> create index dex_index2 on dex(sex,name); Index created. SQL> select object_name ...

  7. VMS项目总结

    开发完一个项目后,如果能够很好的对这个项目做个总结,对我们以后的项目开发以及个人技术的积累都会有很大的帮助.最近在外派公司做完一个系统,在此进行一下深入的总结,也希望给读者带来一些个启示. 一.系统介 ...

  8. linux 系统centOS 7 怎么在线安装mysql

    以下操作,注意空格,为避免出错,可以选择直接copy 第一步: 输入命令行      yum list installed | grep mysql       检查是否已经安装mysql 已安装输入 ...

  9. SQL Server 表的管理_关于事务的处理的详解(案例代码)

    SQL Server 表的管理_关于事务的处理的详解(案例代码) 一.SQL 事务 1.1SQL 事务 ●事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序 ...

  10. C#语言中的XmlSerializer类的XmlSerializer.Deserialize (Stream)方法举例详解

    包含由指定的 XML 文档反序列化 Stream. 命名空间:   System.Xml.Serialization程序集:  System.Xml(位于 System.Xml.dll) 注意: 反序 ...