# Gateway Metrics-Project Scripting

**URL:** <https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487>\
**Category:** Ignition\
**Tags:** ignition81\
**Created:** [December 12, 2022, 9:30am UTC](https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487 "2022-12-12T09:30:57Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Bharadwaj\_G](https://avatars.discourse-cdn.com/v4/letter/b/ecb155/32.png) [@Bharadwaj\_G](https://forum.inductiveautomation.com/u/Bharadwaj_G)\
**Post date:** [December 12, 2022, 9:30am UTC](https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487/1 "2022-12-12T09:30:57Z")

</div>

Hi,  
I am currently working to build alerting based on the threads or heap memory.

Can some one help me to get the performance values likes total threads, waiting threads, heap memory etc using scripting in project...

Thanks in advance ....

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [December 12, 2022, 12:49pm UTC](https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487/2 "2022-12-12T12:49:12Z")

</div>

Start here:

[https://docs.oracle.com/en/java/javase/11/docs/api/java.management/java/lang/management/package-summary.html](https://docs.oracle.com/en/java/javase/11/docs/api/java.management/java/lang/management/package-summary.html)

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 12, 2022, 4:18pm UTC](https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487/3 "2022-12-12T16:18:18Z")

</div>

If you get a GatewayContext (search here on the forums), you can also pull out some Ignition specific metrics from the MetricRegistry:  
[https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.22/com/inductiveautomation/ignition/gateway/model/GatewayContext.html](https://files.inductiveautomation.com/sdk/javadoc/ignition81/8.1.22/com/inductiveautomation/ignition/gateway/model/GatewayContext.html)

---

<div class="post-metadata">

**Author:** ![Bharadwaj\_G](https://avatars.discourse-cdn.com/v4/letter/b/ecb155/32.png) [@Bharadwaj\_G](https://forum.inductiveautomation.com/u/Bharadwaj_G)\
**Post date:** [December 12, 2022, 4:36pm UTC](https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487/4 "2022-12-12T16:36:30Z")

</div>

thanks for ur response, am new to ignition customization and its great help post with example.

How to get the data "getRunningThreadsCount() from PerformanceMonitor class"

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [December 12, 2022, 8:19pm UTC](https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487/5 "2022-12-12T20:19:06Z")

</div>

This is what I use

```auto
def getGatewayMetrics():
	fn = 'getGatewayMetrics'
	from com.inductiveautomation.ignition.gateway import IgnitionGateway
	
	try:
		context = IgnitionGateway.get()
		registry = context.getMetricRegistry()
		metrics = {}
		
		items = registry.getCounters()
		for item in items:
			#LOGGER.info('{}: {}'.format(fn, ', '.join(d for d in dir(item))))
			o = items.get(item)
			metrics[item] = {'type': 'counter',
							 'value': o.getCount()
							}
		
		items = registry.getMeters()
		for item in items:
			o = items.get(item)
			metrics[item] = {'type': 'meter',
							 'value_1min': o.getOneMinuteRate(),
							 'value_5min': o.getFiveMinuteRate(),
							 'value_15min': o.getFifteenMinuteRate()
							}
		
		items = registry.getGauges()
		for item in items:
			o = items.get(item)
			metrics[item] = {'type': 'gauge',
							 'value': o.getValue()
							}
	
	#	for item in registry.getHistograms():
		
		items = registry.getTimers()
		for item in items:
			o = items.get(item)
			metrics[item] = {'type': 'timer',
							 'value_1min': o.getOneMinuteRate(),
							 'value_5min': o.getFiveMinuteRate(),
							 'value_15min': o.getFifteenMinuteRate()
							}
	except:
		import traceback
		LOGGER.error('{}: {}'.format(fn, traceback.format_exc()))
		return {}
	
	return metrics

```

To write the thread count metrics to tags, I use:

```auto
def writeMetricsTags():
	fn = 'writeMetricsTags'
	try:
		metrics = getGatewayMetrics()
		
		if metrics != {}:
			tags = []
			# updated the metrics keys after upgrading from 8.1.5 to 8.1.18 as these changed
			tags.append(['[default]Gateway/{}/Threads/Blocked'.format(THIS_GATEWAY_HOSTNAME), metrics['ignition.performance.threads.blocked']['value']])
			tags.append(['[default]Gateway/{}/Threads/Running'.format(THIS_GATEWAY_HOSTNAME), metrics['ignition.performance.threads.running']['value']])
			tags.append(['[default]Gateway/{}/Threads/Timed_Waiting'.format(THIS_GATEWAY_HOSTNAME), metrics['ignition.performance.threads.timed-waiting']['value']])
			tags.append(['[default]Gateway/{}/Threads/Waiting'.format(THIS_GATEWAY_HOSTNAME), metrics['ignition.performance.threads.waiting']['value']])
			
			system.tag.writeBlocking([tag for tag,val in tags], [val for tag,val in tags])
	except:
		import traceback
		LOGGER.error('{}: {}'.format(fn, traceback.format_exc()))

```

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 12, 2022, 8:35pm UTC](https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487/6 "2022-12-12T20:35:14Z")

</div>

> [@nminchin](#):
>
> `system.tag.writeBlocking([tag for tag,val in tags], [val for tag,val in tags])`

Aw, Nick, c'mon 😄

`system.tag.writeBlocking(*zip(*tags))`

Surely this is more readable 🙂

> [@nminchin](#):
>
> To write the thread count metrics to tags, I use:

Better-throughout-Ignition access to these system metrics is something on our short-to-medium-term to do list; in particular, better alarming.

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [December 12, 2022, 8:41pm UTC](https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487/7 "2022-12-12T20:41:26Z")

</div>

> [@paul-griffith](#):
>
> Aw, Nick, c'mon

It's funny, I actually looked at that part of my script when I posted it and thought, "I know there's a more succinct way to do this... "  
I thought I'd be kind though and let you fix it 😁

---

<div class="post-metadata">

**Author:** ![Bharadwaj\_G](https://avatars.discourse-cdn.com/v4/letter/b/ecb155/32.png) [@Bharadwaj\_G](https://forum.inductiveautomation.com/u/Bharadwaj_G)\
**Post date:** [December 13, 2022, 3:15pm UTC](https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487/8 "2022-12-13T15:15:35Z")

</div>

Hey,  
Thanks for your reply, am getting error "cannot import name IgnitionGateway".

Kindly pls share the process to get things done...

Thanks in advance

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [December 13, 2022, 3:39pm UTC](https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487/9 "2022-12-13T15:39:59Z")

</div>

That import is deliberately undocumented because you can do dangerous things with it. If you cannot figure out how to use that import,and _where_ you can use it, it might be too dangerous for you. But examples are scattered around this forum, if you really must. Paul (an IA employee) very deliberately did not give you an example.

Whatever you do, don't bother IA support with any trouble you run into as a consequence.

The link I posted is for bog-standard and safe java functionality.

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [December 13, 2022, 11:58pm UTC](https://forum.inductiveautomation.com/t/gateway-metrics-project-scripting/67487/10 "2022-12-13T23:58:19Z")

</div>

As a hint, you can only run this from the gateway scope. And if you don't edit my script too much, you won't get yourself into trouble
