blob: 101cc0730d98204224e4f8e30e61319f5206f1a6 [file]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package binaryserialization
import (
"encoding/binary"
"math"
iggcon "github.com/apache/iggy/foreign/go/contracts"
)
type TcpStats struct {
iggcon.Stats
}
// Constants for byte positions and lengths in the payload.
const (
processIDPos = 0
cpuUsagePos = 4
totalCpuUsagePos = 8
memoryUsagePos = 12
totalMemoryPos = 20
availableMemoryPos = 28
runTimePos = 36
startTimePos = 44
readBytesPos = 52
writtenBytesPos = 60
messagesSizeBytesPos = 68
streamsCountPos = 76
topicsCountPos = 80
partitionsCountPos = 84
segmentsCountPos = 88
messagesCountPos = 92
clientsCountPos = 100
consumerGroupsCountPos = 104
)
func (stats *TcpStats) Deserialize(payload []byte) error {
stats.ProcessId = binary.LittleEndian.Uint32(payload[processIDPos : processIDPos+4])
stats.CpuUsage = math.Float32frombits(binary.LittleEndian.Uint32(payload[cpuUsagePos : cpuUsagePos+4]))
stats.TotalCpuUsage = math.Float32frombits(binary.LittleEndian.Uint32(payload[totalCpuUsagePos : totalCpuUsagePos+4]))
stats.MemoryUsage = binary.LittleEndian.Uint64(payload[memoryUsagePos : memoryUsagePos+8])
stats.TotalMemory = binary.LittleEndian.Uint64(payload[totalMemoryPos : totalMemoryPos+8])
stats.AvailableMemory = binary.LittleEndian.Uint64(payload[availableMemoryPos : availableMemoryPos+8])
stats.RunTime = binary.LittleEndian.Uint64(payload[runTimePos : runTimePos+8])
stats.StartTime = binary.LittleEndian.Uint64(payload[startTimePos : startTimePos+8])
stats.ReadBytes = binary.LittleEndian.Uint64(payload[readBytesPos : readBytesPos+8])
stats.WrittenBytes = binary.LittleEndian.Uint64(payload[writtenBytesPos : writtenBytesPos+8])
stats.MessagesSizeBytes = binary.LittleEndian.Uint64(payload[messagesSizeBytesPos : messagesSizeBytesPos+8])
stats.StreamsCount = binary.LittleEndian.Uint32(payload[streamsCountPos : streamsCountPos+4])
stats.TopicsCount = binary.LittleEndian.Uint32(payload[topicsCountPos : topicsCountPos+4])
stats.PartitionsCount = binary.LittleEndian.Uint32(payload[partitionsCountPos : partitionsCountPos+4])
stats.SegmentsCount = binary.LittleEndian.Uint32(payload[segmentsCountPos : segmentsCountPos+4])
stats.MessagesCount = binary.LittleEndian.Uint64(payload[messagesCountPos : messagesCountPos+8])
stats.ClientsCount = binary.LittleEndian.Uint32(payload[clientsCountPos : clientsCountPos+4])
stats.ConsumerGroupsCount = binary.LittleEndian.Uint32(payload[consumerGroupsCountPos : consumerGroupsCountPos+4])
position := consumerGroupsCountPos + 4
hostnameLength := int(binary.LittleEndian.Uint32(payload[position : position+4]))
stats.Hostname = string(payload[position+4 : position+4+hostnameLength])
position += 4 + hostnameLength
osNameLength := int(binary.LittleEndian.Uint32(payload[position : position+4]))
stats.OsName = string(payload[position+4 : position+4+osNameLength])
position += 4 + osNameLength
osVersionLength := int(binary.LittleEndian.Uint32(payload[position : position+4]))
stats.OsVersion = string(payload[position+4 : position+4+osVersionLength])
position += 4 + osVersionLength
kernelVersionLength := int(binary.LittleEndian.Uint32(payload[position : position+4]))
stats.KernelVersion = string(payload[position+4 : position+4+kernelVersionLength])
return nil
}