I understand that custom scripts are not supported, I am just trying to figure out why one server is working but the other isn't.

So we have 2 monitoring servers (different sites) We monitor the Hyper-V replication to the same host. Both version of PRTG are 21.2.68.1492 and both running windows server 2012 r2 with .Net 4.8.

I ran this script on both servers under an elevated powershell x86 command and they generate the xml properly.


#Script for Getting Primary Replication Percent Successful
# Arthur:  Todd Kisida, todd.kisida@xbyte.com
#Takes list of servers in quote delimited by comma as a parameter
#Returns XML for PRTG Custom Advanced Sensor
#The Value returned for each VM is the percentage of successful replication cycles.
param(
[string]$Hypervservers
)
$ErrorActionPreference = "SilentlyContinue"
#start writing in XML
Write-host '<?xml version="1.0" encoding="UTF-8"?>'
Write-Host 	"<prtg>"
#Split the parameter into list of servers
$ServerList = $Hypervservers.Split(",")
foreach ($Hypervserver in $ServerList) {
	#I had issues getting the remote server data unless I opened the remote session to the specific server I was getting the data about.
	#Open a new remote PS session
	$Session = New-PSSession -computername $Hypervserver
	Import-PSSession $Session -Module Hyper-V -warningaction "SilentlyContinue" >$null
	#Get the replication data
	$VMReplication = Measure-VMReplication  -computername $Hypervserver  -ReplicationRelationshipType Simple | select VMname,SuccessfulReplicationCount,MissedReplicationCount
	#Write the data for each VM as a PRTG channel
	foreach ($Name in $VMReplication) {
		#I couldn't get PRTG to display the percent with only 2 decimal places, so I rounded here
		$AvgSuccess = [math]::Round(($Name.SuccessfulReplicationCount / ($Name.SuccessfulReplicationCount + $Name.MissedReplicationCount))*100,0)
		$VM = $Name.VMName
		#The Channel
		Write-Host 	"<result>"
					"<channel>$VM</channel>"
					"<unit>Percent</unit>"
					"<float>1</float>"
					"<decimalMode>2</decimalMode>"
					"<value>$AvgSuccess</value>"
					"<LimitMinWarning>80</LimitMinWarning>"
					"<LimitMinError>70</LimitMinError>"
					"<LimitMode>1</LimitMode>"
					"</result>"
	}
	#Close the remote PS session so it can be opened to the next host
	Remove-PSSession $Session
}
#Close the XML
Write-Host 	"</prtg>"
#Exit code 0 so PRTG knows the script ran successfully
Exit 0

But when I add it to prtg as a sensor, one of the server is missing some of the data.

debug Output from PRTG the working server :

<prtg>
<result>
<channel>Server1</channel>
<Unit>Percent</Unit>
<Float>1</Float>
<DecimalMode>2</DecimalMode>
<value>100</value>
<LimitMinWarning>80</LimitMinWarning>
<LimitMinError>70</LimitMinError>
<LimitMode>1</LimitMode>
</result>
<result>
<channel>Server2</channel>
<Unit>Percent</Unit>
<Float>1</Float>
<DecimalMode>2</DecimalMode>
<value>100</value>
<LimitMinWarning>80</LimitMinWarning>
<LimitMinError>70</LimitMinError>
<LimitMode>1</LimitMode>
</result>
</prtg>

Here is the debug output of the PRTG server that isn't working :

<channel>Server1</channel>
<unit>Percent</unit>
<float>1</float>
<decimalMode>2</decimalMode>
<value>100</value>
<LimitMinWarning>80</LimitMinWarning>
<LimitMinError>70</LimitMinError>
<LimitMode>1</LimitMode>
</result>
<channel>Server2</channel>
<unit>Percent</unit>
<float>1</float>
<decimalMode>2</decimalMode>
<value>100</value>
<LimitMinWarning>80</LimitMinWarning>
<LimitMinError>70</LimitMinError>
<LimitMode>1</LimitMode>
</result>

As you can see the <prtg> <result> and </prtg> are missing.

And the error message is "XML: Junk after document element </channel> -- JSON: The returned JSON does not match the expected structure (Invalid JSON.). (code: PE231)"

What would cause this?

BTW. This started to happen after the update to 21.2.68.1492. I had to recreate the Sensor on the working server because it had stop working and I repeated the same steps on the server that isn't working.


Article Comments