types.go
package clusterinfo
import (
"encoding/json"
"fmt"
"sort"
"strings"
"time"
"github.com/blang/semver"
"github.com/nsqio/nsq/internal/quantile"
)
type ProducerTopic struct {
Topic string `json:"topic"`
Tombstoned bool `json:"tombstoned"`
}
type ProducerTopics []ProducerTopic
func (pt ProducerTopics) Len() int { return len(pt) }
func (pt ProducerTopics) Swap(i, j int) { pt[i], pt[j] = pt[j], pt[i] }
func (pt ProducerTopics) Less(i, j int) bool { return pt[i].Topic < pt[j].Topic }
type Producer struct {
RemoteAddresses []string `json:"remote_addresses"`
RemoteAddress string `json:"remote_address"`
Hostname string `json:"hostname"`
BroadcastAddress string `json:"broadcast_address"`
TCPPort int `json:"tcp_port"`
HTTPPort int `json:"http_port"`
Version string `json:"version"`
VersionObj semver.Version `json:"-"`
Topics ProducerTopics `json:"topics"`
OutOfDate bool `json:"out_of_date"`
}
// UnmarshalJSON implements json.Unmarshaler and postprocesses of ProducerTopics and VersionObj
func (p *Producer) UnmarshalJSON(b []byte) error {
var r struct {
RemoteAddress string `json:"remote_address"`
Hostname string `json:"hostname"`
BroadcastAddress string `json:"broadcast_address"`
TCPPort int `json:"tcp_port"`
HTTPPort int `json:"http_port"`
Version string `json:"version"`
Topics []string `json:"topics"`
Tombstoned []bool `json:"tombstones"`
}
if err := json.Unmarshal(b, &r); err != nil {
return err
}
*p = Producer{
RemoteAddress: r.RemoteAddress,
Hostname: r.Hostname,
BroadcastAddress: r.BroadcastAddress,
TCPPort: r.TCPPort,
HTTPPort: r.HTTPPort,
Version: r.Version,
}
for i, t := range r.Topics {
p.Topics = append(p.Topics, ProducerTopic{Topic: t, Tombstoned: r.Tombstoned[i]})
}
version, err := semver.Parse(p.Version)
if err != nil {
version, _ = semver.Parse("0.0.0")
}
p.VersionObj = version
return nil
}
func (p *Producer) Address() string {
if p.RemoteAddress == "" {
return "N/A"
}
return p.RemoteAddress
}
func (p *Producer) HTTPAddress() string {
return fmt.Sprintf("%s:%d", p.BroadcastAddress, p.HTTPPort)
}
func (p *Producer) TCPAddress() string {
return fmt.Sprintf("%s:%d", p.BroadcastAddress, p.TCPPort)
}
// IsInconsistent checks for cases where an unexpected number of nsqd connections are
// reporting the same information to nsqlookupd (ie: multiple instances are using the
// same broadcast address), or cases where some nsqd are not reporting to all nsqlookupd.
func (p *Producer) IsInconsistent(numLookupd int) bool {
return len(p.RemoteAddresses) != numLookupd
}
type TopicStats struct {
Node string `json:"node"`
Hostname string `json:"hostname"`
TopicName string `json:"topic_name"`
Depth int64 `json:"depth"`
MemoryDepth int64 `json:"memory_depth"`
BackendDepth int64 `json:"backend_depth"`
MessageCount int64 `json:"message_count"`
NodeStats []*TopicStats `json:"nodes"`
Channels []*ChannelStats `json:"channels"`
Paused bool `json:"paused"`
E2eProcessingLatency *quantile.E2eProcessingLatencyAggregate `json:"e2e_processing_latency"`
}
func (t *TopicStats) Add(a *TopicStats) {
t.Node = "*"
t.Depth += a.Depth
t.MemoryDepth += a.MemoryDepth
t.BackendDepth += a.BackendDepth
t.MessageCount += a.MessageCount
if a.Paused {
t.Paused = a.Paused
}
found := false
for _, aChannelStats := range a.Channels {
for _, channelStats := range t.Channels {
if aChannelStats.ChannelName == channelStats.ChannelName {
found = true
channelStats.Add(aChannelStats)
}
}
if !found {
t.Channels = append(t.Channels, aChannelStats)
}
}
t.NodeStats = append(t.NodeStats, a)
sort.Sort(TopicStatsByHost{t.NodeStats})
if t.E2eProcessingLatency == nil {
t.E2eProcessingLatency = &quantile.E2eProcessingLatencyAggregate{
Addr: t.Node,
Topic: t.TopicName,
}
}
t.E2eProcessingLatency.Add(a.E2eProcessingLatency)
}
type ChannelStats struct {
Node string `json:"node"`
Hostname string `json:"hostname"`
TopicName string `json:"topic_name"`
ChannelName string `json:"channel_name"`
Depth int64 `json:"depth"`
MemoryDepth int64 `json:"memory_depth"`
BackendDepth int64 `json:"backend_depth"`
InFlightCount int64 `json:"in_flight_count"`
DeferredCount int64 `json:"deferred_count"`
RequeueCount int64 `json:"requeue_count"`
TimeoutCount int64 `json:"timeout_count"`
MessageCount int64 `json:"message_count"`
ClientCount int `json:"-"`
Selected bool `json:"-"`
NodeStats []*ChannelStats `json:"nodes"`
Clients []*ClientStats `json:"clients"`
Paused bool `json:"paused"`
E2eProcessingLatency *quantile.E2eProcessingLatencyAggregate `json:"e2e_processing_latency"`
}
func (c *ChannelStats) Add(a *ChannelStats) {
c.Node = "*"
c.Depth += a.Depth
c.MemoryDepth += a.MemoryDepth
c.BackendDepth += a.BackendDepth
c.InFlightCount += a.InFlightCount
c.DeferredCount += a.DeferredCount
c.RequeueCount += a.RequeueCount
c.TimeoutCount += a.TimeoutCount
c.MessageCount += a.MessageCount
c.ClientCount += a.ClientCount
if a.Paused {
c.Paused = a.Paused
}
c.NodeStats = append(c.NodeStats, a)
sort.Sort(ChannelStatsByHost{c.NodeStats})
if c.E2eProcessingLatency == nil {
c.E2eProcessingLatency = &quantile.E2eProcessingLatencyAggregate{
Addr: c.Node,
Topic: c.TopicName,
Channel: c.ChannelName,
}
}
c.E2eProcessingLatency.Add(a.E2eProcessingLatency)
c.Clients = append(c.Clients, a.Clients...)
sort.Sort(ClientsByHost{c.Clients})
}
type ClientStats struct {
Node string `json:"node"`
RemoteAddress string `json:"remote_address"`
Name string `json:"name"` // TODO: deprecated, remove in 1.0
Version string `json:"version"`
ClientID string `json:"client_id"`
Hostname string `json:"hostname"`
UserAgent string `json:"user_agent"`
ConnectTs int64 `json:"connect_ts"`
ConnectedDuration time.Duration `json:"connected"`
InFlightCount int `json:"in_flight_count"`
ReadyCount int `json:"ready_count"`
FinishCount int64 `json:"finish_count"`
RequeueCount int64 `json:"requeue_count"`
MessageCount int64 `json:"message_count"`
SampleRate int32 `json:"sample_rate"`
Deflate bool `json:"deflate"`
Snappy bool `json:"snappy"`
Authed bool `json:"authed"`
AuthIdentity string `json:"auth_identity"`
AuthIdentityURL string `json:"auth_identity_url"`
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"`
}
// UnmarshalJSON implements json.Unmarshaler and postprocesses ConnectedDuration
func (s *ClientStats) UnmarshalJSON(b []byte) error {
type locaClientStats ClientStats // re-typed to prevent recursion from json.Unmarshal
var ss locaClientStats
if err := json.Unmarshal(b, &ss); err != nil {
return err
}
*s = ClientStats(ss)
s.ConnectedDuration = time.Now().Truncate(time.Second).Sub(time.Unix(s.ConnectTs, 0))
if s.ClientID == "" {
// TODO: deprecated, remove in 1.0
remoteAddressParts := strings.Split(s.RemoteAddress, ":")
port := remoteAddressParts[len(remoteAddressParts)-1]
if len(remoteAddressParts) < 2 {
port = "NA"
}
s.ClientID = fmt.Sprintf("%s:%s", s.Name, port)
}
return nil
}
func (c *ClientStats) HasUserAgent() bool {
return c.UserAgent != ""
}
func (c *ClientStats) HasSampleRate() bool {
return c.SampleRate > 0
}
type ChannelStatsList []*ChannelStats
func (c ChannelStatsList) Len() int { return len(c) }
func (c ChannelStatsList) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
type ChannelStatsByHost struct {
ChannelStatsList
}
func (c ChannelStatsByHost) Less(i, j int) bool {
return c.ChannelStatsList[i].Hostname < c.ChannelStatsList[j].Hostname
}
type ClientStatsList []*ClientStats
func (c ClientStatsList) Len() int { return len(c) }
func (c ClientStatsList) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
type ClientsByHost struct {
ClientStatsList
}
func (c ClientsByHost) Less(i, j int) bool {
return c.ClientStatsList[i].Hostname < c.ClientStatsList[j].Hostname
}
type TopicStatsList []*TopicStats
func (t TopicStatsList) Len() int { return len(t) }
func (t TopicStatsList) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
type TopicStatsByHost struct {
TopicStatsList
}
func (c TopicStatsByHost) Less(i, j int) bool {
return c.TopicStatsList[i].Hostname < c.TopicStatsList[j].Hostname
}
type Producers []*Producer
func (t Producers) Len() int { return len(t) }
func (t Producers) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
func (t Producers) HTTPAddrs() []string {
var addrs []string
for _, p := range t {
addrs = append(addrs, p.HTTPAddress())
}
return addrs
}
func (t Producers) Search(needle string) *Producer {
for _, producer := range t {
if needle == producer.HTTPAddress() {
return producer
}
}
return nil
}
type ProducersByHost struct {
Producers
}
func (c ProducersByHost) Less(i, j int) bool {
return c.Producers[i].Hostname < c.Producers[j].Hostname
}
types.go的更多相关文章
- AutoMapper:Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 应用场景:ViewModel==>Mode映射的时候出错 AutoMappe ...
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
- iOS 打开本地 其他应用程序(URL Types)
iOS 打开本地其他应用程序(URL Types) /*前言废话:Xcode是神奇的,是我所见到的编译器中最为神奇的,如:它可以同时运行两个甚至更多Project到我们模拟器上,可以同时使用一个模拟器 ...
- Django模型的Field Types总结
转:http://blog.csdn.net/devil_2009/article/details/41735611 Field Types 常用参数: null 如果设置为 True , Djang ...
- C and SQL data types for ODBC and CLI
C and SQL data types for ODBC and CLI This topic lists the C and SQL data types for ODBC and CLI a ...
- allow zero datetime=true导致datetime转换失败:MySql.Data.Types.MySqlDateTime”的对象无法转换为类型“System.Nullable`1[System.DateTime]
allow zero datetime=true导致datetime转换失败:MySql.Data.Types.MySqlDateTime”的对象无法转换为类型“System.Nullable`1[S ...
- "SQL Server does not handle comparison of NText, Text, Xml, or Image data types."
"SQL Server does not handle comparison of NText, Text, Xml, or Image data types." sql2000 ...
- 编译器出现conflicting types for 某某的错误原因总结
直译就是xxxx 发生了一种冲突!比如今天发现的这个错误,实属低级! 本次错误的原因是:函数没有先声明,便写在了主函数后面!应该是先声明,后定义,如果只有定义,则定义必须写在主函数上方.通过查资料,有 ...
- EF中的实体类型【Types of Entity in Entity】(EF基础系列篇8)
We created EDM for existing database in the previous section. As you have learned in the previous se ...
- mybatis报错invalid types () or values ()解决方法
原因: Pojo类User没提供无参数构造方法, 加上该构造方法后,问题解决 ### Cause: org.apache.ibatis.reflection.ReflectionException ...
随机推荐
- 和菜鸟一起学linux之DBUS基础学习记录
D-Bus三层架构 D-Bus是一个为应用程序间通信的消息总线系统, 用于进程之间的通信.它是个3层架构的IPC 系统,包括: 1.函数库libdbus ,用于两个应用程序互相联系和交互消息. 2.一 ...
- RHEL 6 mdadm 实现Soft Raid
环境:RHEL 6.9 x64 1.mdadm命令用于管理系统软件RAID硬盘阵列 格式为:"mdadm [模式] <RAID设备名称> [选项] [成员设备名称]". ...
- python select.select模块通信全过程详解
要理解select.select模块其实主要就是要理解它的参数, 以及其三个返回值.select()方法接收并监控3个通信列表, 第一个是所有的输入的data,就是指外部发过来的数据,第2个是监控和接 ...
- jvm栈-运行控制,jvm-堆运行存储共享单元
JVM-栈 2012-09-17 15:43:53 分类: Java 原文转自:http://www.blogjava.net/nkjava/archive/2012/03/15/371971.ht ...
- Js 实现自定义事件
var Event = { on: function (eventName, callback) { if (!this[eventName]) { this[eventName] = []; } t ...
- Git忽略远程已存在的文件
git设置本地忽略时远程上不存在本地忽略的文件,git将忽略.如果远程分支上存在这个文件,本地在设置ignore将不起作用.换句话说git本地忽略文件必须保证git的远程仓库分支上没有这个要忽略的文件 ...
- [ SSH框架 ] Struts2框架学习之二
一.Struts2访问Servlet的API 前面已经对 Struts2的流程已经执行完成了,但是如果表单中有参数如何进行接收又或者我们需要向页面保存一些数据,又要如何完成呢?我们可以通过学习 Str ...
- vue.js中的全局组件和局部组件
组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能. 组件的使用有三 ...
- Flex 将默认日期格式转化成通用格式
flex 默认日期格式如:Wed Dec 16 00:00:00 GMT+0800 2015 想要得到的通用格式如:2015-12-16 转换方法如下: var sdate:String = &quo ...
- Nginx 的安装与配置
一.下载 Linux:CentOS 7.3 64位 Nginx:nginx-1.13.1 安装目录:/usr/local/ wget http://nginx.org/download/nginx-1 ...