It has been some time since I could give my donators a new goodie, and this time it is a library/tool to profile and monitor your B4J + B4A (7.01+) apps (not limited to ABMaterial WebApps!) I’ve been needing something like this for some time for my own projects, but couldn’t find one that suited me. This can be a very good asset to find Memory Leaks or to track which method takes up to much time.
Using a very simple API, you can track how long the code execution time is, the times hit, average time, memory usage etc for any block of code you want to investigate. I deliberately gave you this API freedom, as profiling ALL your code (as most programming languages do) is just drowning you in to much information so you don’t see the wood for the trees anymore.
QUICK NOTE: Do not forget to set your DONATORKEY and the port in the Viewer params.txt . The same port and the IP of your Viewer have to be used in the apps you are monitoring!
How it works:
ABMonitor uses the Jamon library, which has a extremely low overhead on your code. Just by disabling it (using the SetActive method), you can actually leave it in your production apps if you want (or use B4Js conditional compiling if you want to get rid of it all together in a production app).
ABMonitor consists of two main parts:
1. The ‘live’ ABMonitor Viewer.
Instructions: Simply start the Viewer in a command prompt using: java -jar ABMonitor.jar
This Viewer shows all the stuff you are monitoring with the API. It shows e.g. how many times some part of your code was hit, how long it took, what the average time was, when it was last accessed, memory consumption etc… It is presented in a TreeView Table, so you can check every detail (depending on how deep you’ve coded your profiling). At the bottom, the last 50 runs are presented in some line charts.
Because the IDE of B4X is ‘live’, so is the Viewer! Thanks to this unique feature of the B4X products, you can update your code and see the results in the Viewer immediately.
Little side note: This ‘live’ IDE part is a little-known/promoted feature (except within the B4X community of course, as for us this is normal), but it has a HUGE advantage over any other tool out there. In similar market aimed tools, like Xojo for example, you have to compile and re-compile every single time you make the smallest of changes to your code (on bigger projects it takes up to 20 minutes, some users reported). In B4X, just change the code, and continue running. Not happy with it? Change it again and see what gives. BIG production time-saver! Some of you who used to program in VB6 know what I mean…
2. The ABMonitorB4X libraries (ABMonitorB4A.jar/ABMonitorB4J.jar).
Install instructions: Copy the xml and jars (dont’t forget jamon-2.81.jar), to your B4A or B4J libraries folder. In the IDE select the ABMonitorB4X library, the RandomAccessFile library and the Network library.
This API connects your own apps with the monitor. It basically consists of a Start and a Stop method.
First, we have to make the connection with the Viewer. Thanks to Erels new Resumable Subs, doing this is a breeze:
In Main make some declarations:
Sub Process_Globals Public Monitor As ABMonitor Private port As Int = 10090 ' &lt;-- Set your Viewers Port! Private ip As String = "127.0.0.1" ' &lt;-- Set your Viewers IP! Private abmonitor As AsyncStreams Private client As Socket ' Useful to quickly activate/deactivate the monitoring Public TRACKMONITOR As Boolean = True End Sub
Next add the following resumable sub:
Sub ConnectMonitor() Dim c As Socket c.Initialize("client") c.Connect(ip, port, 5000) Wait For Client_Connected (Successful As Boolean) If Successful Then client = c abmonitor.InitializePrefix(client.InputStream, False, client.OutputStream, "abmonitor") Log("ABMonitor connected") Monitor.SetActive("Template", True,abmonitor, 5) Else Log("ABMonitor disconnected") End If End Sub Sub abmonitor_Error Monitor.SetActive("Template", False,Null, 0) Log("ABMonitor disconnected") End Sub
You can set the interval the data should be send to the Viewer, in seconds, with the last parameter in ‘Monitor.SetActive(“Template”, True,abmonitor, 5)’. In this example, it is every 5 seconds. Note: This does not mean it is tracked every 5 seconds! The library will continue tracking everything, but it will only send all the info over to the Viewer every 5 seconds.
Finally, Initialize the monitor and call the resumable sub when your app starts (a good place is e.g. before StartMessageLoop in a Server app):
... Monitor.Initialize("YOURDONATORKEY") ConnectMonitor StartMessageLoop
Ready to do some monitoring!
As I said, there are basically only two commands: Start and Stop.
There are two ways to monitor/profile your code (you can mix the use of them):
a. Monitor some code:
You want to monitor a query, or a whole sub, … In general this is a complete block of code.
Good practice is using the class/module name as the Group parameter, and the method name as the Label, but you can put whatever you want. This will later be used in the Viewer to group stuff. (Group and Label are the first and second parameters in the calls).
Private Sub WebSocket_Connected (WebSocket1 As WebSocket) If Main.TRACKMONITOR Then Main.Monitor.Start("ABMPageTemplate", "WebSocket_Connected", "") ' ... the code you want to monitor If Main.TRACKMONITOR Then Main.Monitor.Stop("ABMPageTemplate", "WebSocket_Connected", "") End Sub
Or tracking a query:
.. If Main.TRACKMONITOR Then Main.Monitor.Start("ABMPageTemplate", "MySlowQuery", "") Dim SQL_str As String SQL_str = "SELECT cases.CaseID, cases.CaseUserID, cases.CaseType, cases.CaseSummary FROM tCases WHERE cases.CaseStatus=1;" Dim cases As List = DBM.SQLSelect(SQL, SQL_str, Null) If Main.TRACKMONITOR Then Main.Monitor.Stop("ABMPageTemplate", "MySlowQuery", "") ...
b. Monitor methods which are used in multiple places, and you want to know where it was called.
You have for example a page.Refresh method, which is called in multiple places. You can use the third parameter to set the ‘caller’. In general there will only be one line of code between the start() and stop().
This caller will later be used in the Viewer to build a call tree (or stack trace)
Private Sub WebSocket_Connected (WebSocket1 As WebSocket) ... If Main.TRACKMONITOR Then Main.Monitor.Start("ABMPageTemplate", "page.Refresh", "WebSocket_Connected") page.Refresh If Main.TRACKMONITOR Then Main.Monitor.Stop("ABMPageTemplate", "page.Refresh", "WebSocket_Connected") ... End Sub public Sub ConnectPage() ... ' refresh the page If Main.TRACKMONITOR Then Main.Monitor.Start("ABMPageTemplate", "page.Refresh", "ConnectPage") page.Refresh If Main.TRACKMONITOR Then Main.Monitor.Stop("ABMPageTemplate", "page.Refresh", "ConnectPage") ... End Sub
As you can see, you are totally free to monitor anything you want.
Call for action: if anyone out there is a guru in making B4i libraries, please PM me! The java library code is quite simple and it shouldn’t be to hard for an experienced B4i library coder to write one which can connect to the same Viewer. If we got this one too, then we’ve covered all major platforms in B4X!
ABMonitor is part of a multi-pack on libraries, frameworks and tools all Donators to this blog receive.
Included are currently:
ABExchange (B4J) It can be used to sync the ABMCalendar control with your exchange server and outlook. It can also send a mail.
ABJasperReports (B4J) his is a little library that allows you to export reports created in Jasper Reports in your B4J applications. They can be exported to pdf, html and xls. You can use parameters defined in JasperReports.
ABPDFBox (B4J) With this library you can print PDF files (either by showing a dialogbox or directly to a specified printer). Works in UI and NON-UI apps.
ABMonitor (B4J + B4A) Tool to monitor/profile your B4A (7.01+) and B4J code! Includes the libraries for both platform + the ABMonitor Viewer. See the tutorial for more info.
ABCron (B4J + B4A) A more advanced timer library that can schedule more intelligently tasks using Cron expressions. You can also set a start and end datetime. I’ve added a method RestartApplicationNONUI() that should restart you .jar file when the Cron expression is met.
ABEvaluator (B4J + B4A) Evaluate mathematical expressions. You can also write your own functions in B4J/B4A.
ABPlugin (B4J) Create Live plugins for you own apps. This means you can create plugins that can be added/removed while your app is running. Note it is a little experiment that shows the power of B4J. The ‘compile to library’ feature of B4J is very handy to create plugins.
ABZXCVBN (B4J + B4A) Realistic password strength estimation.
ABTreeTableView (B4J) Custom B4J component which combines a TreeView with a TableView.
Until next time!