How to get diagnostic statistics from UWP application

We need to update the application that we use for the universal Windows application (UWP). The main purpose of the application is to collect diagnostic statistics and send it back to our server using a call to rest.

However, I do not find api available for statistics

Before that we were

PerformanceCounter _memoryCounter = new PerformanceCounter();

public SystemProperty GetPhysicalMemory()
    {
        string s = _QueryComputerSystem("totalphysicalmemory");
        double totalphysicalmemory = Convert.ToDouble(s);
        double d = _GetCounterValue(_memoryCounter, "Memory", "Available Bytes", null);
        return new SystemProperty { PropertyName = "Physical Memory", Total = totalphysicalmemory, Used = totalphysicalmemory - d };
    }

which returned the total number of used and free bytes of memory. We also collected statistics on the network and processor. None of them are compatible with the new structure. What namespace should I look for for this function? Or do I need to use something like Pinvoke ( link )?

0
source share
2 answers

. : pinvoke

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;


namespace Monitoring
{

    public static class NativeCallsWrapper
    {
        private static SYSTEM_INFO sysInfo = new SYSTEM_INFO();
        private static MEMORYSTATUSEX mem = new MEMORYSTATUSEX();

        [DllImport("kernel32.dll", SetLastError = false)]
        public static extern void GetSystemInfo([In, Out] SYSTEM_INFO Info);

        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool GlobalMemoryStatusEx([In, Out] MEMORYSTATUSEX lpBuffer);

        static NativeCallsWrapper()
        {
            GetSystemInfo(sysInfo);
            GlobalMemoryStatusEx(mem);
        }

        [StructLayout(LayoutKind.Explicit)]
        public struct SYSTEM_INFO_UNION

        {

            [FieldOffset(0)]
            public UInt32 OemId;
            [FieldOffset(0)]
            public UInt16 ProcessorArchitecture;
            [FieldOffset(2)]
            public UInt16 Reserved;
        }

        public struct SYSTEM_INFO

        {

            public SYSTEM_INFO_UNION CpuInfo;
            public UInt32 PageSize;
            public UInt32 MinimumApplicationAddress;
            public UInt32 MaximumApplicationAddress;
            public UInt32 ActiveProcessorMask;
            public UInt32 NumberOfProcessors;
            public UInt32 ProcessorType;
            public UInt32 AllocationGranularity;
            public UInt16 ProcessorLevel;
            public UInt16 ProcessorRevision;
        }

        [StructLayout(LayoutKind.Sequential)]
        public class MEMORYSTATUSEX
        {
            public uint dwLength;
            public uint dwMemoryLoad;
            public ulong ullTotalPhys;
            public ulong ullAvailPhys;
            public ulong ullTotalPageFile;
            public ulong ullAvailPageFile;
            public ulong ullTotalVirtual;
            public ulong ullAvailVirtual;
            public ulong ullAvailExtendedVirtual;
            public MEMORYSTATUSEX()
            {
                this.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX));
            }
        }

        public static GeneralStatistics getGeneralStatistics()
        {
            GeneralStatistics generalStatistics = new GeneralStatistics();
            generalStatistics.numberOfProcesses = (int)sysInfo.NumberOfProcessors;
            generalStatistics.memoryTotal = mem.ullTotalPhys / 1048;
            generalStatistics.memoryInUse = (mem.ullTotalPhys - mem.ullAvailPhys) / 1048;
            return generalStatistics;
        }
    }
}
+2

Source: https://habr.com/ru/post/1605838/


All Articles