shows queue usage as a percentage

This commit is contained in:
2025-11-07 14:28:01 +01:00
parent 77ed74a203
commit ba07a8af9b
3 changed files with 21 additions and 13 deletions

View File

@@ -213,7 +213,7 @@ record(ai,"$(INSTR)$(NAME):ELAPSED-TIME")
record(longin,"$(INSTR)$(NAME):UDP_DROPPED")
{
field(DESC, "Max Events in Queue")
field(DESC, "UDP Packets Missed")
field(EGU, "Events")
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) DROP")
@@ -224,8 +224,8 @@ record(longin,"$(INSTR)$(NAME):UDP_DROPPED")
record(longin,"$(INSTR)$(NAME):UDP_WATERMARK")
{
field(DESC, "Max Events in Queue")
field(EGU, "Events")
field(DESC, "UDP Queue Usage")
field(EGU, "%")
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) UDP")
# field(SCAN, "I/O Intr")
@@ -235,8 +235,8 @@ record(longin,"$(INSTR)$(NAME):UDP_WATERMARK")
record(longin,"$(INSTR)$(NAME):SORTED_WATERMARK")
{
field(DESC, "Max Events in Queue")
field(EGU, "Events")
field(DESC, "Partial Sort Queue Usage")
field(EGU, "%")
field(DTYP, "asynInt32")
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) SORT")
# field(SCAN, "I/O Intr")

View File

@@ -96,8 +96,10 @@ asynStatus asynStreamGeneratorDriver::createInt32Param(
setIntegerParam(*variable, initialValue));
}
asynStatus asynStreamGeneratorDriver::createFloat64Param(
asynStatus status, char *name, int *variable, double initialValue) {
asynStatus asynStreamGeneratorDriver::createFloat64Param(asynStatus status,
char *name,
int *variable,
double initialValue) {
// TODO should show error if there is one
return (asynStatus)(status | createParam(name, asynParamFloat64, variable) |
setDoubleParam(*variable, initialValue));
@@ -114,7 +116,7 @@ asynStreamGeneratorDriver::asynStreamGeneratorDriver(
const int kafkaMaxPacketSize)
: asynPortDriver(portName, 1, /* maxAddr */
asynInt32Mask | asynFloat64Mask |
asynDrvUserMask, /* Interface mask */
asynDrvUserMask, /* Interface mask */
asynInt32Mask, // | asynFloat64Mask, /* Interrupt mask */
0, /* asynFlags. This driver does not block and it is
not multi-device, but has a
@@ -125,6 +127,7 @@ asynStreamGeneratorDriver::asynStreamGeneratorDriver(
0), /* Default stack size*/
num_channels(numChannels + 1), kafkaEnabled(enableKafkaStream),
monitorTopic(monitorTopic), detectorTopic(detectorTopic),
udpQueueSize(udpQueueSize), kafkaQueueSize(kafkaQueueSize),
// measured in max packet sizes
udpQueue(
epicsRingBytesCreate(243 * udpQueueSize * sizeof(NormalisedEvent))),
@@ -308,15 +311,17 @@ asynStatus asynStreamGeneratorDriver::readInt32(asynUser *pasynUser,
getParamName(function, &paramName);
if (function == P_UdpQueueHighWaterMark) {
*value = epicsRingBytesHighWaterMark(this->udpQueue) /
sizeof(NormalisedEvent);
const double toPercent = 100. / (243. * udpQueueSize);
*value = (epicsInt32)(epicsRingBytesHighWaterMark(this->udpQueue) /
sizeof(NormalisedEvent) * toPercent);
// Aparently resetting the watermark causes problems...
// at least concurrently :D
// epicsRingBytesResetHighWaterMark(this->udpQueue);
return asynSuccess;
} else if (function == P_SortedQueueHighWaterMark) {
*value = epicsRingBytesHighWaterMark(this->sortedQueue) /
sizeof(NormalisedEvent);
const double toPercent = 100. / (243. * udpQueueSize);
*value = (epicsInt32)(epicsRingBytesHighWaterMark(this->sortedQueue) /
sizeof(NormalisedEvent) * toPercent);
// epicsRingBytesResetHighWaterMark(this->sortedQueue);
return asynSuccess;
}

View File

@@ -150,8 +150,10 @@ class asynStreamGeneratorDriver : public asynPortDriver {
const int num_channels;
const bool kafkaEnabled;
const int kafkaQueueSize;
const int kafkaMaxPacketSize;
const int udpQueueSize;
epicsRingBytesId udpQueue;
epicsRingBytesId sortedQueue;
@@ -168,7 +170,8 @@ class asynStreamGeneratorDriver : public asynPortDriver {
asynStatus createInt32Param(asynStatus status, char *name, int *variable,
epicsInt32 initialValue = 0);
asynStatus createFloat64Param(asynStatus status, char *name, int *variable, double initialValue = 0);
asynStatus createFloat64Param(asynStatus status, char *name, int *variable,
double initialValue = 0);
inline void queueForKafka(NormalisedEvent &ne);