# History of what has been done so far

## 2011-xx-xx

- Changed behavior for all CM's, now discarding all ASE Messages with number 0, which probably is a 'print message'
  If this is not the behavior you want this can be changed from the config file, using:
  `shortCmName.discardMsgZero=true|false
  shortCmName.discardMsgZeroPrintInfo=true|false`
- Changed behavior for all CM's, now discarding all ASE Messages that has to do with "in recovery" or "LOAD DATABASE"
  When databases where undergoing "LOAD DATABASE", some CM's failed with messages complaining complaining about database is offline or in recovery...
  Also the 'get ASE configuration' when connecting, complained about the same thing...
  If this is not the behavior you want this can be changed from the config file, using:
  `shortCmName.discardMsgLoadDb=true|false
  shortCmName.discardMsgLoadDbPrintInfo=true|false`
- Bug fix: Open an empty offline database gives strange error messages.
  When connecting to an offline database, I simply check if some AseMon system tables exists, if they do not exists, inform user about this and stay in the Connection Dialog.
- Bug fix: The wizard 'Create Offline Session' wrote the wrong user/password in the props file.
  And the PersistWriter class picked up the wrong password if it was encrypted.
- Bug fix: The wizard 'Create Offline Session', created empty ssh information to the offline file.
  This was done even if none was necessary, which broke no-gui mode in some cases.
- Bug fix: The RepAgent collector, used a ASE 15.x syntax, which made ASE 11.5.4.x to break.
  Solution: simply removing the optional text in: 'fetch [next from] cursor_name into @var'
- Added some items when grabbing ASE Configuration at startup.
  'sp_version', 'sp_shmdumpconfig' and 'sp_monitorconfig'
- Added shortcut buttons to Sourceforge and Facebook at the Summary Panel.
- Granting 'sybase_ts_role' ...

## 2011-07-15

- Extended the check and save of ASE Configuration
  Now sp_helpdb, sp_helpdevice, sp_helpserver and active traceflags are also stored in the Persistent Counter Storage
  Trace flags also has a short explanation. The description are static and was extracted from ASE 15.5 The values can be viewed from the main menu -> View -> View ASE Configuration...
- If there were "blocking locks" in the system or "full transaction logs", a dialog pops up and asked if you want to "move" to that "tab". The decision was hard to reset...
  I added a button in the concerned "tabs" so you reset the "Move to tab" decision.
- "Offline Session Viewer" Dialog:
  - If you did "show" on a Timestamp and the parent SessionLevel had not been loaded, it will automatically be loaded in the main window. This means it will load all the graphs for that period and then position you at the Timestamp you did "show" on.
  - The right click menu on the root objects now has a menu item to check what version of AseMon that was used to save the performance counters.
  - Option "Show Counter Info". If this is checked the TreeTable also shows what Performance Counters that has been saved. A counter will display, which reflects how many records each Performance Counter has. "---" means no records.
    At the day, hour and minute level a counter "summary" will display, this will tell you how many records all the children levels has.
    Note: This will probably be redone, so I need feedback on how to solve this better.
- "Connection Dialog", tab "Counter Storage" and "Offline Connect", button "..."
  This button now opens the JFileChooser in same directory as the currently used database file.
  When you choose a new database file. The old file will be replaced with the chosen one.
  If any templates was currently selected, the JFileChooser will be opened in $ASEMON_SAVE_DIR
- Added some "internal" to the "Sample Information", which can be accessed via the tool tip
  - SQL Refresh Time - How long it took to execute the SQL statement to get Performance Counters
  - GUI Refresh Time - How long it took to refresh the GUI, including sorting the JTable
  - Local Calculation Time - Time spent in the method localCalculation()
- All tabs: Automatic Resize of Column Width, on/off
  Previously all columns width was auto resized every now and then, in many cases this caused you'r eyes to flip around on the screen, which is some cases was a bit disturbing.
  Now I'm saving the column width along with the column order, sort order etc. This means that we now can choose if we want the previous saved layout or do automatic resize of the column width.
  - In the right click menu in any Performance Counters JTable you can set what you want to do for this table, the options are 'Use Global Settings' or 'Do Auto Adjustment' or 'Use the saved column width'
  - In the MainMenu->Preferences->Auto Resize Column Width you can choose to 'Auto Adjustment' or not.
  This is especially useful when viewing AseMon recordings (offline data)
- Tab: Active Statements
  Tooltip help for HasMonSqlText and HasDbccSqlText was sometimes to wide, so now I try to format the text before showing it in the tooltip. This means, making line brakes if the output is to wide.
- Tab: Statement Cache Details
  Local Options to enable/disable 'SQL Text' and 'Showplan' results has been added.
  This was introduced so we can disable it in the case those options took to much memory in AseMon or they where using to much resources on the ASE server side.
- Tab: Objects
  Added a column TabRowCount, which simply does row_count(DBID, ObjectID), if this is to heavy, it can be disabled with the property `CMobjActivity.TabRowCount=false`.
  Note TabRowCount is only done in 15.0 or above
  Took away all the cluster columns in 15.5, if we are not connected to a cluster ASE
- Tab: Spinlock Sum
  Added records to track individual spinlocks on Data Caches (each CACHLET is now calculated)
  Added records to track individual spinlocks on Engine RunQueue (type=KERNEL-INST)
  Also a column 'type' was added, which contains: CACHE, CACHLET, DBTABLE, RESOURCE, KERNEL, KERNEL-INST, OTHER
  Let me know if it takes more resources than previously.
- New Dialog: Change 'Graph' Order and Visibility
  In this one you can change the order of the graphs in the Trend Graphs Dashboard
  The dialog can be reached from main menu: View -> Change 'Graph' Order and Visibility and from right click on any of the graphs.
- Changes to graph enable/disable
  Previously enable/disable of graphs could only be done from the Main Menu->View->Active Graphs
  Now you can right click on any of the graphs, and in the "AseMon Menu" you have options to enable and disable graphs.
  In any of the Performance Counter Tabs, in the Options Panel, top right, there is now a "graph" button. If the button is visible this Tab has Graphs attached. By clicking on the button, you can enable or disable the graphs attached to this Performance Counter Tab. Also in the "Summary" panel you have the Graph Button, right beside the label "Summary Panel", Click it to enable or disable graphs attached to the Summary Fields.
- Added one field to the Summary panel, 'Full Transaction Logs'.
  When there are databases that has full Transaction Logs, a red icon in the status bar shows up, telling you how many databases that has full transaction logs.
  If you press the icon, you will jump to the 'Databases' tab.
  In Databases Tab, databases with full transaction logs will be marked with a red background.
- Bug fix: If you connected to a "offline database" to view sampled performance counters, then you couldn't disconnect and connect to a new "offline database" without restarting the GUI.
  This is now fixed. Some additional cleaning up could be done like: clearing the GUI, but then latest graphs that were loaded will also be cleared. So lets wait with the "full clean" a bit...
- nogui mode: Added `-f | --finish` switch, which shutdown or stop the no-gui service after # hours
- nogui mode: Changed `-d | --dbname` switch, which specifies the offline URL string.
  `-d|--dbname` Now accepts variables `${DATE}, ${SERVERNAME}, ${ASEHOSTNAME}, ${ASEMON_HOME}, ${ASEMON_SAVE_DIR}`
  Explanation of the above variables
  - `${DATE[:format=fmt[;roll=true|false]]}`
    The DATE will be substituted with a timestamp, the format of the timestamp is specified by modifier 'format'.
    The DATE variable has modifiers, which means you can change the behaviour of the variable.
    - modifier: "`format=formatSpecification`" Is how the DATE string should be built. the specification is according to `java.text.SimpleDateFormat`, and the default value is `yyyy-MM-dd`
    - modifier: "`roll=true|false`" This means: start/create a new database if we roll over into a new DATE string. with format=`yyyy-MM-dd` a new DB will be created every midnight, with format=`yyyy-MM-dd_HH` a new DB will be created every hour. The default value for `roll` is `false`.
    The default value for `format` can be changed with in the Configuration file with property `PersistWriterJdbc.h2DateParseFormat=formatString`
    The default value for `roll` can be changed with in the Configuration file with property `PersistWriterJdbc.h2NewDbOnDateChange=true|false`
  - `${SERVERNAME}`
    The SERVERNAME will be substituted with the content of the ASE global variable `@@servername` of which ASE server we are monitoring.
  - `${ASEHOSTNAME}`
    The ASEHOSTNAME will be substituted with the output from ASE function `asehostname()` of which ASE server we are monitoring.
  - `${ASEMON_HOME}`
    The ASEMON_HOME will be substituted with the installation path of AseMon.
  - `${ASEMON_SAVE_DIR}`
    The ASEMON_SAVE_DIR will be substituted with ${ASEMON_HOME}/data or whatever the environment variable is set to.
  Example:
  `asemon -Usa -Pnull -SGORAN_1_DS -uxyz -ppasswd -shost1 -n all -i 30 -D H2 -d xxx.${ASEHOSTNAME}.${DATE:format=yyyy-MM-dd.HH;roll=true}`
  The above example, does:
  - Connects to ASE 'GORAN_1_DS' with user 'sa'
    `-Usa -Pnull -SGORAN_1_DS`
  - Host monitoring on host 'host1' with user 'xyz'
    `-uxyz -ppasswd -shost1`
  - Samples all Performance Counters
    `-n all`
  - Sample every 30 seconds
    `-i 30`
  - Use H2 as the database storage
    `-D H2`
  - H2 dbname would be 'xxx.host1.2011-05-04.19' in current path. Every hour a new database will be created.
    `-d xxx.${ASEHOSTNAME}.${DATE:format=yyyy-MM-dd.HH;roll=true}`
- The variables `${DATE}, ${SERVERNAME}, ${ASEHOSTNAME}, ${ASEMON_HOME}, ${ASEMON_SAVE_DIR}` also works in the Connection Dialog in the "Counter Storage" tab.
- Changed the name of the error log.
  For GUI mode: still ~/.asemon.AseMon.log
  For NO-GUI mode: ~/.asemon.AseMon.nogui.log
  Previously when running GUI and NO-GUI mode on same machine, they shared the error log.
- if you are using ASE to store the performance counters, then use DYNAMIC_PREPARE and do 'set statement_cache off', this for performance reasons.
  NOTE: this is only done by specifying -D and -d switches for the moment.
- In "offline-read" mode, the "Offline Session Viewer" dialog checks for new Samples, which could arrive in the background. A Watermark in the dialog will tell you how many new samples that has been stored since last "refresh". Background storage of Performance Counters could for example be performed by the "no-gui" process if anyone has started that module.
- nogui mode: Added `-r | --reconfigure` switch
  This means that even if some ASE configuration options is not set, then configure them automatically.
  Configuration names and there defaults is presented below.
  It's only configuration options with a equal sign after, which automatically can be reconfigured.

  Name | Configuration
  --- | ---
  Summary | NONE
  Objects | enable monitoring=1, object lockwait timing=1, per object statistics active=1
  Processes | enable monitoring=1, object lockwait timing=1, wait event timing=1
  Databases | enable monitoring=1
  Temp Db | enable monitoring=1, object lockwait timing=1, per object statistics active=1
  Waits | enable monitoring=1, wait event timing=1
  Engines | enable monitoring=1
  System Load | NONE
  Data Caches | enable monitoring=1
  Pools | enable monitoring=1
  Devices | enable monitoring=1
  IO Sum | enable monitoring=1
  IO Queue | enable monitoring=1
  Spinlock Sum | NONE
  Sysmon Raw | NONE
  RepAgent | NONE
  Cached Procedures | per object statistics active=1
  Procedure Cache | enable monitoring=1
  Procedure Call Stack | NONE
  Cached Objects | NONE
  Errorlog | enable monitoring=1, errorlog pipe active=1, errorlog pipe max=200
  Deadlock | enable monitoring=1, deadlock pipe active=1, deadlock pipe max=500
  Proc Cache Module Usage | NONE
  Proc Cache Memory Usage | NONE
  Statement Cache | enable monitoring=1, enable stmt cache monitoring=1, statement cache size
  Statement Cache Details | enable monitoring=1, enable stmt cache monitoring=1, statement cache size
  Active Objects | enable monitoring=1, per object statistics active=1
  Active Statements | enable monitoring=1, statement statistics active=1, wait event timing=1
  Blocking | enable monitoring=1, wait event timing=1
  Missing Statistics | capture missing statistics
  sp_monitorconfig | NONE
  OS CPU(vmstat) | NONE
  OS Disk Stat | NONE
  OS CPU(mpstat) | NONE

- The mouse wheel is now much faster when scrolling over graphs and SQL Tool Query result sets
- Upgraded some of the third party libraries/jars
  - To version 3.2.1, Component: jChart2D
  - To version 3.7.4, Component: MIGLayout
  - To version 1.3.155, Component: H2 database
  - To version 2011-05-15, Component: ProxyVole

## 2011-04-21

- New Tab: RepAgent, which is the same thing as the RepAgent section from sp_sysmon
  Note: This has dependencies on the tab 'spinlock', which does the dbcc command...
- Extended error checking when connecting to a ASE Server.
  Note: more work is needed here, but I have a hard time trying all various ASE configurations.
- Dialog "found new AseMon version". Now shows a HTML Pane with "What's new" (history.html)
- The Wizard pages now has a Overview page, which describes what the Wizard is good for
  Basically a Overview what the wizard does...
- Tab 'System Load':
  Added graph: 'Run Queue Length, Server Wide' averaging over all engines and instances (if it's a cluster').
  Added graph: 'Run Queue Length, Per Engine' Uses the 'Avg_1min', this so we can see the 'Run Queue Length' per engine to verify if any engine are overloaded.
  Note: this only work if we are above 15.5
- Tab 'Waits':
  I added a column WaitTimePerWait, which is the calculation of WaitTime / Waits
- Tab 'Objects':
  I added a column LockContPct, which describes the lock contention in percent
- Tab 'Devices':
  Added column 'TotalIOs', Just a summary of Read + Writes
  Added column 'ReadsPct', How much of the total IO's was reads
  Added column 'APFReadsPct', How many of the reads where Async Prefetch requests
  Added column 'WritesPct', How much of the total IO's was writes
- Tab 'Databases':
  For Cluster Edition, now calls db_recovery_status(DBID) to check if the database is undergoing node-failure recovery.
  Added column 'AppendLogContPct', how much contention in percent do we have on the Log Semaphore
  Also added a graph that shows the Log Semaphore Contention, so we can see the trend.
- Tab 'Temp Db':
  Added column 'AppendLogContPct', how much contention in percent do we have on the Log Semaphore
  Also added a graph that shows the Log Semaphore Contention, so we can see the trend.
- Tab 'Statement Cache':
  Added column 'CacheHitPct', Reuse percentage of the statement cache.
  Added column 'UnusedSizeKB', Just how much memory is free for the moment.
  Added column 'AvgStmntSizeInKB', How much memory does each of the statements take.
  Added column 'NumStatementsDiff', which simply is a duplicate of 'NumStatements', but it has difference calculations applied to it.
  Added right-click menu: - Remove ALL entries from the Statement Cache. do: dbcc purgesqlcache
  Added right-click menu: - Print Summaries of the Statements in the Statement Cache. do: dbcc prsqlcache
  Added Graph for: NumSearches, HitCount, NumInserts, NumRemovals
- Tab 'Statement Cache Details':
  Added column 'HasShowplan' and 'msgAsColValue' The associated execution plan of the SSQLID.
  Added column 'HasSqltext' and 'sqltext' The SQL Text of the SSQLID.
  Also rearranged the column order and added tooltip.
  Added right-click menu: - Remove ALL entries from the Statement Cache. do: dbcc purgesqlcache
  Added right-click menu: - Remove A Specific ${SSQLID} from the Statement Cache. do: dbcc purgesqlcache(${SSQLID})
  Added right-click menu: - Print info about the Statement ${SSQLID}. do dbcc prsqlcache(${SSQLID}, 1)
- Tab 'Proc Cache Module Usage':
  Added column 'ActiveDiff', which simply is a duplicate of 'Active', but it has difference calculations applied to it.
  Added a graph, which displays the Active count for each module, so we can track this for a longer time. When I did this I also needed to implement a minimum size of the graph panel (since I wanted this graph larger than the defaults), which also lead to a right-click menu on the graph's panel so we can set a new minimum size on all the graph panels. Unfortunately to reach the menu you need to right-click at the very bottom of the graph panel (below the series labels)
- Tab 'Proc Cache Memory Usage':
  Added column 'ActiveDiff', which simply is a duplicate of 'Active', but it has difference calculations applied to it.
- Added more explanations to the MonWaitEventIdDictionary.
  'Comments' and 'Most Common Cause' was used from the document: Managing Workloads with ASE: Techniques for OLTP Scaling and Performance Management with Large SMP and Shared Disk Clusters
  which you can get from: http://www.sybase.com/detail?id=1091630
- Added some Menu shortcuts, connect, disconnect etc...
- Basic Operating System Monitoring capabilities
  Three new Tabs has been created for this:
  - `OS Disk Stat` which uses iostat or vmstat to get OS disk statistics
  - `OS CPU(vmstat)` which uses vmstat to get OS overall OS statistics
  - `OS CPU(mpstat)` which uses mpstat to get OS statistics per CPU
  The 'Operating System Monitoring' subsystem is using a SSH (Secure Shell) connection to remote host. In that SSH connection we can kick of the various OS Commands and receive the output (see below for more details)
  Below is a breath description of the subsystem
  - What is this Basic Operating System Monitoring.
    If you want to monitor the Operating System with some basic command, this is one way you can do it.
    And also if you are storing the Performance Counters in a Persistent storage, the OS Monitoring is in sync with
    the Performance Counters from the monitored ASE Server, which makes it easier to correlate the various metrics.
  - What OS Monitoring Commands are supported for the moment.
    The basic command which for the moment is supported is:
    - `iostat`
    - `vmstat`
    - `mpstat`
    If you are using Veritas as the Disk IO subsystem and want to sample disk statistics with vxstat and not iostat.
    Make sure vxstat is executable and in the $PATH off the user that you're connecting to the Operating System with.
    Then it will execute vxstat instead of iostat and use that information.
  - But every Operating System work slightly different.
    But all Operating Systems has different layouts for the various commands.
    For Example 'iostat' does not produce the same output on Solaris as it does on Linux.
    When a connection to the OS made, It will try to identify what OS were connecting to (by using uname -a) and then use OS specific parsers.
    This implies that a \"parser\" is implement for every OS.
    So if you are getting errors, faulty output or that your OS is not supported, please notify me and I will try to fix it.
    Also if you want to change the parameters/flags to the OS Commands, to get better Performance Counters, kick me and I'll fix it!
    The only thing that can change by ourself is the OS Commands sleep interval
    This is done by adding the below information to the configuration file. (asemon.properties)"
    - for iostat: `MonitorIoSolaris.sleep=5`
    - for mpstat: `MonitorVmstatAix.sleep=5`
    - for vmstat: `MonitorMpstatLinux.sleep=5`
    You can probably fill in the blanks... `[Monitor][Subsystem][Osname].sleep=[samplePeriodToTheCommand]`
    If you need to debug or check what the OS Command is sending, you can add the following to the Configuration file:
    `log4j.logger.asemon.hostmon.HostMonitor=DEBUG`
    Or you can use the 'log viewer' to change the 'log level' while AseMon is still running:
    MainMenu->View->Open Log Window..., then Press 'Set log level'... locate asemon.hostmon.HostMonitor and change it.
  - The big picture of how it's implememted.
    The way it's implemented:
    - Start a background task that executes for instance 'iostat' every 2 seconds (iostat -xdz 2) or whatever sample period (see section above).
    - Parse the output from the OS Command and store it in a intermediate in-memory storage.
    - Then when AseMon think it's time to sample some Performance Counters (depends on AseMon's sample time)
      The subsystem does an average calculation on the intermediate stored values and then resets the intermidiate storage so that new samples from the OS Command can be sampled.
    - Now the Performance Counters or values are available to view in AseMon.
    For 'vmstat' I choose a slightly different approach, this since 'vmstat' is only delivering one row per vmstats-sample period.
    So in this case I do not do a summary or average calculation.
    Instead I simply displays all the sampled records I have received from the command with a 'timestamp' column to indicate when it was received.
    If you instead want to have some kind of average or summary, please notify me and explain...
  - What to expect in upcomming releases of AseMon.
    In current release there are limited support for User Defined OS Monitoring, which you can add to the Configuration file
    In future release, the plan is to add a Wizard where you can add User Defined Host Monitor Counters and maybe support for diff/rate counters as well.
    With a Used Defined OS Monitoring you could for example Monitor Outputs from your Application Server or in whatever way you think is's usable.

        #-------------------------------------------------
        # Example of a simple file list
        # isStreaming=false, means that it's executed at every AseMon sample interval
        #-------------------------------------------------
        hostmon.udc.TestGoransLs.displayName                   = List of files in $HOME
        hostmon.udc.TestGoransLs.description                   = This would be the tooltip help on the Tab for: List of files in $HOME
        hostmon.udc.TestGoransLs.osCommand                     = ls -Fl | egrep -v '^d'
        hostmon.udc.TestGoransLs.osCommand.isStreaming         = false
        hostmon.udc.TestGoransLs.addStrColumn.umode            = {length=10, sqlColumnNumber=1,  parseColumnNumber=1,  isNullable=false, description=xxx}
        hostmon.udc.TestGoransLs.addIntColumn.files            = {           sqlColumnNumber=2,  parseColumnNumber=2,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addStrColumn.owner            = {length=10, sqlColumnNumber=3,  parseColumnNumber=3,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addStrColumn.group            = {length=10, sqlColumnNumber=4,  parseColumnNumber=4,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addIntColumn.sizeInBytes      = {           sqlColumnNumber=5,  parseColumnNumber=5,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addStrColumn.date             = {length=10, sqlColumnNumber=6,  parseColumnNumber=6,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addStrColumn.time             = {length=5,  sqlColumnNumber=7,  parseColumnNumber=7,  isNullable=true,  description=xxx}
        hostmon.udc.TestGoransLs.addStrColumn.filename         = {length=99, sqlColumnNumber=8,  parseColumnNumber=8,  isNullable=true,  description=xxx}

        #-------------------------------------------------
        # Example of mpstat
        # isStreaming=true, means that it's executed once, and a background thread parses the output stream from the command
        #                   and on each AseMon sample interval, a average calculation is done on the sampled records.
        #                   numOfSamples is an counter indicator, which reflects how many sampled records the average is based on.
        #-------------------------------------------------
        hostmon.udc.TestGoransMpstat.displayName               = UD Mpstat
        hostmon.udc.TestGoransMpstat.description               = This would be the tooltip help on the Tab for: UD Mpstat
        hostmon.udc.TestGoransMpstat.osCommand                 = mpstat -P ALL 1
        hostmon.udc.TestGoransMpstat.osCommand.isStreaming     = true
        hostmon.udc.TestGoransMpstat.addStrColumn.CPU          = {length=30,             sqlColumnNumber=1,  parseColumnNumber=3,  isNullable=false, description=Processor number. The keyword all indicates that statistics are calculated as averages among all processors.}
        hostmon.udc.TestGoransMpstat.addIntColumn.numOfSamples = {                       sqlColumnNumber=2,  parseColumnNumber=0,  isNullable=true,  description=Number of 'sub' sample entries of iostat this value is based on}
        hostmon.udc.TestGoransMpstat.addStatColumn.usrPct      = {precision=10, scale=1, sqlColumnNumber=3,  parseColumnNumber=4,  isNullable=true,  description=Show the percentage of CPU utilization that occurred while executing at the user level (application).}
        hostmon.udc.TestGoransMpstat.addStatColumn.nicePct     = {precision=10, scale=1, sqlColumnNumber=4,  parseColumnNumber=5,  isNullable=true,  description=Show the percentage of CPU utilization that occurred while executing at the user level with nice priority.}
        hostmon.udc.TestGoransMpstat.addStatColumn.sysPct      = {precision=10, scale=1, sqlColumnNumber=5,  parseColumnNumber=6,  isNullable=true,  description=Show the percentage of CPU utilization that occurred while executing at the system level (kernel). Note that this does not include time spent servicing hardware and software interrupts.}
        hostmon.udc.TestGoransMpstat.addStatColumn.iowaitPct   = {precision=10, scale=1, sqlColumnNumber=6,  parseColumnNumber=7,  isNullable=true,  description=Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.}
        hostmon.udc.TestGoransMpstat.addStatColumn.irqPct      = {precision=10, scale=1, sqlColumnNumber=7,  parseColumnNumber=8,  isNullable=true,  description=Show the percentage of time spent by the CPU or CPUs to service hardware interrupts.}
        hostmon.udc.TestGoransMpstat.addStatColumn.softPct     = {precision=10, scale=1, sqlColumnNumber=8,  parseColumnNumber=9,  isNullable=true,  description=Show the percentage of time spent by the CPU or CPUs to service software interrupts.}
        hostmon.udc.TestGoransMpstat.addStatColumn.stealPct    = {precision=10, scale=1, sqlColumnNumber=9,  parseColumnNumber=10, isNullable=true,  description=Show the percentage of time spent in involuntary wait by the virtual CPU or CPUs while the hypervisor was servicing another virtual processor.}
        hostmon.udc.TestGoransMpstat.addStatColumn.guestPct    = {precision=10, scale=1, sqlColumnNumber=10, parseColumnNumber=11, isNullable=true,  description=Show the percentage of time spent by the CPU or CPUs to run a virtual processor.}
        hostmon.udc.TestGoransMpstat.addStatColumn.idlePct     = {precision=10, scale=1, sqlColumnNumber=11, parseColumnNumber=12, isNullable=true,  description=Show the percentage of time that the CPU or CPUs were idle and the system did not have an outstanding disk I/O request.}
        hostmon.udc.TestGoransMpstat.setPkColumns              = CPU
        hostmon.udc.TestGoransMpstat.setPercentColumns         = usrPct, nicePct, sysPct, iowaitPct, irqPct, softPct, stealPct, guestPct, idlePct
        hostmon.udc.TestGoransMpstat.setSubSampleColumn        = numOfSamples
        hostmon.udc.TestGoransMpstat.setParseRegexp            = DEFAULT
        hostmon.udc.TestGoransMpstat.skipRows.CPU              = CPU
        #--------------------------------- OK, lets attach a graph to it as well
        hostmon.udc.TestGoransMpstat.graph=true
        hostmon.udc.TestGoransMpstat.graph.type=byRow
        hostmon.udc.TestGoransMpstat.graph.name=mpstatGraph
        hostmon.udc.TestGoransMpstat.graph.label=MpStat Graph
        hostmon.udc.TestGoransMpstat.graph.menuLabel=MpStat Graph
        hostmon.udc.TestGoransMpstat.graph.data.cols=idlePct
        hostmon.udc.TestGoransMpstat.graph.data.methods=absVal
        hostmon.udc.TestGoransMpstat.graph.data.labels=-pk-

- Configurations will now be get from several Configuration files
  The search order is USER_TEMP, USER_CONF, SYSTEM_CONF: so if you save something in your private files it will override the System configuration.
  The default configuration files are: USER_TEMP='$HOME/.asemon/asemon.save.properties', USER_CONF='$HOME/.asemon/asemon.user.properties', SYSTEM_CONF='$ASEMON_HOME/asemon.properties'
- Added some command line options, -D for shortcut ASE/ASA PCS storage.
  Also fixed some issues for PCS when storing data in ASE and ASA
  Fixed the "check for new sample values", this is useful when: reading a Persistent Storage from the GUI, while at the same time someone (probably the no GUI mode) is applying data to it.
- When "In Development Version" and "time to live" has expired, the GUI will still be able to start, but a very restricted environment is available. Only: Persistent Counter Storge - Read (offline read) will be available.
  This 'start' option was implemented as a fail-safe mechanism, and should only be used if the new AseMon version is not capable of reading the old database. In 99.9% the new AseMon version will be able to read Performance Counters stored by a earlier AseMon release.
- Added "Pre Defined SQL Statements" in the main menu: tools->Predefined SQL Statements
  In here there is a bunch of SQL Statements that can help you...
  You can add you'r own statements in the "user" properties file "$HOME/.asemon/asemon.user.properties"
  The `01` and `02` is used to specify in what order in the menu they should be presented.

      # Do some SQL
      user.predefined.sql.01.name                      = xxx - select something, bla bla bla
      user.predefined.sql.01.execute                   = select NOW=getdate()

      # Execute your stored proc, if the proc isn't installed, install it using the file.
      # needsVersion is if it containes SQL that is onlky valid from a specific version of ASE (specified as 15032, for 15.0.3 ESD#2, should always be 5 numbers)
      user.predefined.sql.02.name                      = sp__xxx - my own proc...
      user.predefined.sql.02.execute                   = exec sp__xxx
      user.predefined.sql.02.install.needsVersion      = 0
      user.predefined.sql.02.install.dbname            = sybsystemprocs
      user.predefined.sql.02.install.procName          = sp__xxx
      user.predefined.sql.02.install.procDateThreshold = 2011-04-14
      user.predefined.sql.02.install.scriptName        = C:/tmp/sp__xxx.sql
      user.predefined.sql.02.install.needsRole         = sa_role

- Swing Event Dispatch Thread (EDT) debuging...
  If the GUI seems a bit slow or unresponsive, you can turn on a debug option -x EDT_HANG
  Then you will get stacktraces when EDT runs into deadlocks and when a single execution on the EDT takes to long... This will simplify debugging and fixing GUI issues in the future.
  Turn this on with: -x EDT_HANG
  Check available debug options: -x list
- bug fix: if a Graph was indicated as "non visible" on creation, the option "Enable background data polling" in the Performance Counter Tab was disabled, which ment that we couldn't enable BG mode without first "enable and disable" the graph attached to this CM.
  Now I wont change the background property, I will simply show a label in the right corner of the "options" panel, that says "has active graphs", if any graphs is active for this Performance Counter.
- Made some changes to dependant Performance Counters and how they do refresh
  A bit less messages in the error log, and better GUI watermarks for when next refresh should happen.
- bug fix: SQL Capture tool
  When to sample data in the tabs 'Object', 'Waits' and 'Locks' did not work to 100%
  Now it works as it does in the Main window.
- Using ant to make final distribution
  The distribution is not using aseman.jar as it's compiled source (classes dir is just there for development)
  asemon_YYYY-MM-DD.zip does not contain the asemon subdirectory anymore. So unpacking has changed slightly
- Also a bunch of small changes not mentioned in this doc.

## 2011-01-12

- The work to port to Java Generics has been started...
- Splash screen when starting.
- Check for Java 6 version is done prior to starting asemon (in that bat/sh file)
  This because in java 6, we are using the splash screen option, which is not available in earlier releases on java. If the version control is done later, then we will receive an error that the command line switch '-splash' is unknown...
- When switched to Java 1.6 and JXTable 1.6.2, the below started to happen:
  When rows are deleted from a JTable, in some cases it used the "deleted" view row from the table to get cell values for rendering in some cases.
  I don't know why this is happening, but it seems to happen in some repaint scenario when I have highlighters (in JXTable) + a bunch of more stuff...
  A lot of the faults has been removed, but some are still left...
  A ';' sign is printed to the standard output every time it happens. This just to notify me in the future, that the problem still exists...
- Tab: active statements
  Added 2 columns 'HasMonSqlText' and 'MonSqlText', which does:
  select SQLText from master..monProcessSQLText where SPID = <SPID>
  This will show the current running SQL Statement, this will then also include SQL statements that has been executed via dynamic SQL inside a Stored procedure. exec('do SQL here'). In some cases/versions it's not showed by DBCC sqltext().
  It will also help you to validate if the SQL statement is still running. Info from the monProcessSQLText only has rows if the statement is still running, while DBCC sqltext will show you the last executed SQL statement, which is still left in the PSS structure.
- Tabs: Process, Active Statements, Blocking
  On SPID's that are blocked: Changed default color to PINK (almost read)
- In Memory History: the history time can now be set lower than the Graph History
  A Spinner on the right of "Graph History in Minutes" is now available...
  To access the "in memory history", press the "DB magnifyingGlass" icon on the toolbar.
- Cell renders has been changed to format numbers in a better way.
  Spaces between "large" numbers for readability.
- Multiple column sorts can now be done (current implementation supports 3 columns).
  The column header, has a indicator that tells you if the sort is done Ascending, Descending or Unsorted. The indicator also tells you if this column is the first, second or third column in the sort.
  Initial Sort order (first click) has also been changed to Descending, so that high numbers is at top, because this is what we normally want to sort at.
- Storing and Restoring of JTable Column Order, Visibility and Sort Order now works better.
  Especially when viewing offline and in-memory data.
- Now also storing/restoring the filter panel on asemon restarts.
  Also applying the filters when changing between different data samples in the offline mode. also works when changing between InMemory view and Regular Online view.
- Tab: Active Statements
  Previously the MultiSampled flag was raised when the SPID was present between two samples.
  Now that check also includes in the StartTime for the statement is the same.
- ASE Configuration (both sp_configure, sp_helpcache and sp_cacheconfig) are stored in the Persistent Counter Storage (a offline database) when asemon starts.
  The configuration can be viewed from the GUI when reading the offline database.
- New Tab: Procedure Call Stack
  This will show the nesting level of how the procs/triggers/views are executed.
  This could be used as a small profiler, to check what procedure stack is currently executing, but to make it into a better profiler this needs to be sampled *often*, which might not be a good idea...
- New graphs:
  - CPU Summary using global variables @@cpu_busy, @@cpu_io (depends on tab 'Summary')
  - Number of transactions (only in ASE 15.0.3 ESD#1 and higher) (depends on tab 'Summary')
  - Number of Connections/users that are connected to the ASE (depends on tab 'Summary')
  - Disk read/write per second using global variables @@total_read, @@total_write (depends on tab 'Summary')
  - Network Packet read/sent per second using global variables @@pack_recv, @@pack_sent (depends on tab 'Summary')
  - Checkpoint and Housekeeper Writes per second (depends on tab 'Processes')
  - Number of Procedure Requests per Second (depends on tab 'Procedure Cache')
- Tab: Engines
  in ASE 15.5 the column 'IO CPU Time' was added to the monEngine table...
  Start to use that one, otherwise the percentage calculation will be wrong.
- Number of tabs has started to be a factor... it becomes harder to navigate between them.
  So now you can hide tabs that you are not using, or simply reorder the tabs to suit your usage of asemon.
  Right click on any tab, and choose 'Tab Options', in here you can personalize the tabs a bit.
  Or from the main menu: View -> Change 'Tab Titles' Order and Visibility
  The second thing that has been done on tab navigation is: on the toolbar two new buttons has been added where you can Activate (jump to) a specific tab. One button is in the original order, the second button is sorted on the tab title name.
- New Tab: sp_monitorconfig
  This simply executes the procedure sp_monitorconfig, which could be handy to have
  Recommendation is to have the 'postpone' field set to 600 (10 minutes or so), so we do not sample this that often.
- Saving the active graphs in the Summary panel, did not work, fixed that...
  So now after a restart I remember what graphs was active or disabled.
- File Location changes:
  Temporary GUI save settings file (asemon.save.properties), "screen capture" files and log files directory has been moved from ($HOME) to ($HOME/.asemon)
- When the expire date for the in-development release a GUI pop up is showed.
- Tab: Processes
  The local option "Show System Processes" did not work on some ASE versions, this was fixed
- Tab: Active Objects: In some cases (for example "self joins"), the object/table was presented several times by the MDA tables, which caused this tab to fail.
  This has been fixed in the following way: if several rows with the same PK is found, and we have a column that is named 'dupMergeCount', we simply merge the previous found row with the current one (simulate a sum()) and increment the column 'dupMergeCount', the last thing is done just to specify how many rows we actually merged into this row.
  If 'dupMergeCount' is above 0, then we will have several rows summarized into this row.
- Command line parameters: A couple of new ones has been introduced
  For example: -U user -P passwd -S server -s sampleTime -d h2dbname
  These switches is mainly for the --noGui option (override values in the noGui config file)
  If you have not produced a noGui config file via the "offline wizard" you can now choose to specify --NoGui small|medium|large|all, which collects a predefined subset of Performance Counters into the Persistent Counter Storage.
  If you want full control over what to collect, please use the "offline wizard" to specify what Performance Counters that should be collected.
- Tab: Blocking
  Fixed so that it can contain multiple PK (this since no difference calculations is done in this tab)
- The pop up dialog informing you about "out of memory" situations, now the OK button works to close the window
- The tooltip on column header does not work in offline mode.
  The solution was to store the MDA help dictionary stuff in the offline database, and read it in again when connection to a offline database.
- In earlier releases the ESD level was reset to 0 or 1 when it was over 9
  Now the max ESD level is keept at 9, so even if you running ESD#10 it will show as #9 in the internal integer holding ase version.
  This will be redone in later some later release, using better granularity of the version number.
  Also ESD number handling was changed in some release to support "sub ESD levels", so a @@version string can now look like (Adaptive Server Enterprise/12.5.4/EBF 15400 ESD#7.1/P/...)
  The parsing for this does now work, but I do not keep track of the ESD sub level.
- Tab: Cached Procedures
  Now has a Icon, which tells you what type of object it is (rule, view, trigger or procedure)
- When asemon connect to ASE it puts the asemon version into the sysprocesses.host field
- Tab: Active Statements
  new option: get procedure call stack, which also gets the procedure call stack from the table monProcessProcedures
- SQL Window Tool, add icon so it's visible in the "taskbar" in windows.
  This makes it easier to navigate between many different SQL Windows...
- When in the in-memory view, the previous versions still updated the 'Summary' panel.
  This is not done anymore.
- A Dummy/Demo test application has been made, so you can "simulate" workload towards an ASE Server and train yourself how to use asemon.
  This is the file perfdemo.bat
  To be able to use this you must install a test/demo database, see README.txt and DO_DEMO.txt in classes/asemon/perftest/sql for more information
  My intention was not to release this application, I created it simply to do "dummy load" on the ASE server during a customer demo that I gave, but you might also be able to use it, please give me some feedback if it should be included in the package or if I should be deleted.
  So the README.txt and DO_DEMO.txt files are just my internal notes...

## 2010-10-29

- Changed to Java 1.6, so I wont support JVM 1.5 anymore...
  The change to 1.6 was needed for the new SwingX (JXTable etc) 1.6.2 (went from 1.0 to 1.6.2)
- A first attempt to store column order and restore that order after restart.
  This will most likely fuckup some other stuff where I don't convert viewToModel, but it's a first attempt...
  Also storing the sort order and restores that.
- Also added some 'restore column order' and some other stuff into the right click menu on Counter Model tables.
- Changed from JChart2D 3.1.0 -> 3.2.0
  Changed the tool tip to be on 2 rows, showing "Label: value\n Time: time"
- A first attempt to save and load the filter (Column, Operation, Value, NoZeroCounters)
- When moving around using the arrows key on the keyboard on the in-memory and offline slider caused the system to update the view on every keystroke. This overloaded the system when holding down the arrow key. So I added timers of 100ms, which means that loading of data is done when no input has been given for 100ms.
- Using proxy-vole (http://code.google.com/p/proxy-vole) as a automatic proxy resolver when checking updates or doing other http requests.
  For example this means that if the client is using a proxy server when doing internet/web lookups, the client can now use the PAC file in IExplorer or Firefox to figgure out what proxy server to use. (PAC=Proxy Auto Config. http://en.wikipedia.org/wiki/Proxy_auto-config)

## 2010-06-22

- New version of the H2 database is used: 1.2.135 (2010-05-08)
  This version supports embedded BLOBS in the database, so no extra directories for blobs will be created
- Tab: Processes & Active Statements
  Added column 'WaitClassDesc', which is the class description for the WaitEventID
- Tab: Active Statements
  - Added column 'multiSampled', which is 'YES' if the PK (SPID, monSource [,InstanceID]) was visible in the previous sample as well
  - Added column 'pssinfo_tempdb_pages' to check how many tempdb pages this SPID is currently using
  - Added column 'tempdb_name' to check what tempdb this SIPD is using
  - Stacktrace, which is deferred to the localCalculation() method is not executed if the WaitEventID has changed.
  - Tooltip on sqlText is not adding extra newlines, which made large outputs a bit unreadable
  - Also marked the 'multiSampled' rows with the color 'ORANGE'
  - InMemoryHistory: Is now showing the checkboxes and tooltip for Active Statements
- Tab: Cached Objects
  Changed default postponeTime to 600, every 10 minutes
- Tab: Blocking
  Is now only available for ase servers over version 15.0.0 ESD#2
- Tab: System Load
  Rearranged the column layout to make it a bit more readable
- Dialog: CheckForNewUpdates
  Now doing a better job of remembering the checkbox 'do not show this again'
  And some better text descriptions...
- Dialog: ConnectionDialog
  For the 'offline read', you can start the H2 as a network server
- in 'offline read' mode, I added 'Fast Forwad' and 'Rewind' buttons, which goes to the next sample time that has data for this tab. It's especially good in 'Active Statement' and other tabs where data is not always present, for example if you have the 'postpone time' set...
  The Buttons are located in every tab in the 'Sample Information' panel.
- Added a "rowcount" label to indicate how many rows there are in the JTable.
  It's located "Show Counter Type" panel
- Some changes how data is displayed in the 'offline read' if data can't be found for the selected sample period
- Connection dialog:
  in tab 'Counter Storage', Changed the layout of the panel/JTable "What Counter Data should be Persisted"
- Offline wizard:
  in page 3 'What should be offline sampled', Changed the layout of the panel/JTable
  And added the button "Set to Template", so we can reuse what we are currently doing in the GUI.
- Upgraded to latest H2 version, 1.2.137 (2010-06-06)

## 2010-04-27

- A bunch of bug fixes and improvements not listed here
- Tab: Processes
  The choice to disable sampling of "system threads".
  In ASE Cluster Edition, there are a bunch of system threads/SPID's, which could blur the vision in this tab.
  For now; this was implemented using SQL, but in the future it might very well be a "filter" option instead. Then we would still benefit from the "Persistence Counter Storage" to store all threads in the database (if we were using that), but when later when viewing data we could filter them out in the GUI.
- Query Window:
  When doing "ctrl-c" to copy into the clipboard in some places the new-line was not copied.
  A "copy" button was also implemented that takes "all" the objects in the result set output and put it into the clipboard, JTables are coped into ASCII tables. keys: F5, F9 are now shortcuts to execute SQL, this to emulate dbisql
- You can now Pause all data collection by pressing the 'Pause icon' on the tool bar or the 'Pause Icon' in the status field. To resume data collection, just press the same icon gain, which now will have a 'Play icon'.
- Added dbcc pss(0, ${SPID}, 2) on the right click in all tables.
- Tab: Engines
  Only select records from monEngines with the Status 'online'.
  Also a new column 'IOCPUTime' was added if you're above ASE 15.5 and 15.0.3 CE
  NOTE: it's currently not part of the percentage calculation.
- For ASE Cluster Edition, remember the system_view settings (cluster or instance)
  The system view can be changed in the 'Summary' tab if you are connected to a ASE CE.
- Login dialog: when pressing enter in the password field and all the mandatory fields are filled in a login is attempted (same as pressing OK button).
- Screen shots can now be made from a button on the tool bar, using the "Camera icon".
  It will produce a JPG file in the "home" directory.
- Tab: Objects when we are in 15.5 and 15.0.3 CE, I have added a bunch of new columns, mainly for Cluster Edition measurements...
- In the 'Summary' tab I also grabs @@connections and an 15.5 or 15.0.3 CE I also get Transactions from the monState table. (in CE the Transactions columns does not seem to work in a good manner)
- When there are blocking spid's, a red icon in the status bar shows up, telling you how many spid's that are currently blocked. If you press the icon, you will jump to the 'Blocking' tab.
- If you're running out of memory, I will try to clear all in memory history and do Garbage Collection. After the GC hopefully enough memory will be available to continue.
  TODO: I show a blocking message, this needs to changed into a non blocking message.
- An all tabs: a User Defined SQL statement for tool tip on cell content can be added
  This is done in the config file, example:
  table.tooltip.SPID=select * from sysprocesses where spid = ?
  table.tooltip.CMprocActivity.SPID=select suser_name(suid) from sysprocesses where spid = ?
  The first config would execute SQL and show the result set as a tool tip in all tab's
  The second will override the default when you are in tab 'CMprocActivity'.
  For SPID there is a default tool tip that shows some info from monProcess
- Tab: Active Statements
  A spid that holds blocking locks, may not always be visible in monProcessStatement
  For example id you in isql do 'begin tran; insert into t1 values(1); go', the spid will be in status 'waiting for incoming network data' and not really active.
  There for I introduced two set of rows 'ACTIVE' and 'BLOCKER', the 'ACTIVE' originates from monProcessStatement, while 'BLOCKERS' are spid's that blocks others from working. Both the 'ACTIVE' and the 'BLOCKER' can be visible in the table.
  Also added 'dbcc stacktrace' of all spid's visible in this table
  The ability to disable 'showplan', 'sqltext' and 'stacktrace' can be done from the GUI and is written to the user settings temporary property file as 'CMActiveStatements.sample.showplan=false, CMActiveStatements.sample.dbccSqltext=false, CMActiveStatements.sample.dbccSqltext=false'.
  Also added column 'BlockingOtherSpids' which is a list of spid's that the current spid is blocking, and by the way, rows/spid's that blocks other will be marked with the color red.
- bugfix: User Defined Counter wizard, name checking was partially faulty.
  Name can now only be a-z, A-Z, 0-9 and not starting with CM.
- Added 'needRole' to CounterModel and UserDefinedCounterModel, which will be checked just as 'needConfig' and show errors on the 'tab' if you are not authorized to view the 'tab'.
  Also added a bunch of stuff so that non 'sa' users can use the tool as well.
- Better support for command line switches. This is now done in java instead of the bat or shell script that starts asemon.
- Made changes in the ConnectionDialog to support JDBC options + a JdbcOptionDialog where you can choose from the JDBC driver provided options. Or simply type them in manually
  Also multiple host:port are fetched from the sql.ini/interfaces file and can also be typed in manually. However jConnect doesn't seem to like it...
  If the information which is you can switch to use the "raw" URL mode instead, check the 'Use URL' check box, then the URL text field will be used when connection. By pressing <enter> in the field the URL text will be parsed and transferred to the above disabled fields.

## 2010-02-22

- Added "sp_showplan" and "dbcc sqltext" in tab 'Active Statements'.
  The full showplan text is displayed using tool tip. Or copy the table using right click 'copy table to clipboard'.
- Added 'Data Type' in the Create 'User Defined Counter' Wizard.
  If it's not a number datatype, the column can't be chosen as a 'diff' counter
  Also added some checks in the Graph part, so that we can't continue, if wrong method type is chosen (if diff is not on, only absolute methods can be chosen)
- Table Cell background color can be customized in the properties file, defaults are:

      	CMobjActivity.color.index     = ORANGE

      	CMprocActivity.color.system   = YELLOW

      	CMprocActivity.color.running  = GREEN

      	CMprocActivity.color.blocked  = ORANGE

      	CMprocActivity.color.blocking = RED

      	CMcachedObjects.color.index   = ORANGE

      	CMActiveObjects.color.index   = ORANGE

      	CMblocking.color.blocking     = RED

- Changed Copy + Paste handling from the JTable
  Which means I added 'Copy Cell', 'Copy Row' and also added 'Copy Table as Ascii-table'
- If you are on a slow connection to the dataserver, it will now work faster.
  I removed a lot of extra calls to Connection.isClosed(), which issues 'exec sp_mda 0,7' to check if the connection is alive or not. I simply cached the check for X milliseconds.
- The QueryWindow now has a ScrollPane/SplitPane for the SQL Text as well.
  When the window is opened the size of the SQL Text is "calculated" to a proper size for that specific SQL Batch.
  Also added 'Copy table/row to clipboard' in the jtable popup menu

## 2010-02-14

- Asemon now works with ASE Cluster Edition
  The column InstanceId has been added in the case we connects to a Cluster Enabled ASE. Some extra information is also displayed in the 'Summary' tab. In this panel you can also choose if you want to view counters for the whole cluster or just the instance which asemon is connected to.
  Specific Counter Tab's will probably added later on, but for now create you'r own Cluster Specific counters using the wizard 'create User Defined Counter', please send you'r best Cluster Edition Counters to me so I can implement them for everyone.
- Added Counter tab 'Sysmon Raw' which works in peer with 'Spinlock Sum'.
  This counter is in extreme first version, and just reads the values that was left over from the 'Spinlock Sum' counter tab. No enrichment of the data has be done so far, so it's just the "raw" counters that the sp_sysmon is using.
  In the future a sp_sysmon look alike can be done (lets use a JXTreeTable for that).
- A better implementation of the indicator icon, now the Icon on the Tab is repainted or replaced with a 2 pixel larger icon that has a green stripe on the left side of the icon.
  Thanx Reine Lindqvist
- A new Counter Tab 'Blocking' that shows information about SPID's that are involved in a normal 'blocking lock' situation.
  This was also done by Reine Lindqvist
- change to the tab 'Blocking' when we have blocking SPID's
  If 'Lock Waits' counter in the 'Summary' panel is above 0, an popup will ask you if you want to set the 'Blocked' tab as the active tab.
- Color coding on some Counter tabs
  tab - 'Objects': ORANGE = This is an Index
  tab - 'Cached Objects': ORANGE = This is an Index
  tab - 'Active Objects': ORANGE = This is an Index
  tab - 'Blocking': RED = when column 'Blocked State' == 'Blocking'
  tab - 'Processes': RED = when 'SPID' is Blocking other SPID's
  tab - 'Processes': ORANGE = when 'SPID' are Blocked by other SPID's
  tab - 'Processes': YELLOW = when 'Login' is empty, meaning it's a ASE SYSTEM thread/spid
  tab - 'Processes': GREEN = when 'status' is in 'running' or 'runnable'
- Added Java version check when asemon starts. has to be 1.5 for the moment.
- bugfix: on 'Processes' Tab, when not case sensitive sort order, the problem 'Ambiguous column name spid' was raised.

## 2010-01-28

- Implemented "offline" reader
  This means that we now can read data from a database into the GUI, the data has previously been stored by asemon into that database (Persistent Counter Storage).
  The sampled data could have been stored by the "non gui" mode or by the GUI itself, and viewed at a later time.
  This functionality also enables us to have one "no gui" asemon that stores the data in the Persistent Counter Storage and many asemon GUI's that views the data.
  That is if several dba's wants to view the same data without having several asemon GUI's that each individually issues SQL statements to collect data.
  Please I need feedback on how this is working...
- A green "line/stripe" at the right hand side of the tab on the TabbedPane, which indicates that there are sampled data under that tab.
  This needs rework, because it overwrites menu items, tool tip and other components that are displayed on top of the "stripe" indicator.
- In the Persistent Counter Storage, you can now choose if you want to store all data or just some of them, you can choose to store Absolute, Diff or Rate Counters in the data store.
  There are check boxes for this in each counter panel and also in the Wizard that creates an file for the off line storage.
- If we loose the database connection to the monitored server in GUI mode, it tries to automatically reconnect if the option is set in the Connection dialog.
- Menu->view->Set Counter Set Parameters
  Is a new Dialog where you can change most of the options that is normally located under each "tab". This means that you do not have to click around so much when you want to change some option under all the various tabs.
- The graphs are now zoomable. Just drag the mouse over the are you want to zoom in on. Right click and do "zoom out" when you are done.
- When creating a offline session file from the wizard, the passwords are now encrypted.

## 2009-11-23

- 'Deadlock' and 'Errorlog' tabs now works again.
- two new tabs 'System Load' and 'Temp Db'
  'System Load' needs ASE 15.5 or higher and shows information from the monSysLoad, which can help you determine how long the "run queue length" is. Which is almost the same as 'load average' on Unix systems. 'Temp db' shows you various information about tempdb usage.
- The filter now also works for 'Deadlock' and the 'Errolog' tabs
- 'Diff' and 'Rate' counters choice panel are now disabled if there are no diff columns specified
- introduced 'needAseVersion' and 'needAseConfig' for all CM's
  This means it's easier to specify lowest ASE version for this "tab" to start work. The same goes for configuration.
  If version or configuration is not satisfied a "watermark" text on the tab will show what was wrong.
- In all tabs, a new time option were introduced, the 'postpone'...
  This means that for tabs that we do not want to sample as often as we usually do, we can set a minimum time to wait before we refresh this tab. This could be used for tabs like 'Cached Objects' which could be "heavy" for the system to sample on every sample interval.
- The summary panel now also contains a bunch of new counters.
- If ASE is between 15.0.3 esd#1 and 15.0.3 esd#3 and sp_configure 'capture missing statistics' is true. The CR 581760 makes ASE to capture statistics for MDA Tables, which might lead to a full transaction log in the master database.
  So check for a "near full" transaction log and do 'dump tran master with truncate_only' if we are near.
- If the stored procedure 'sp_missing_stats' in the tab 'Missing Statistics' is missing. It will automatically be installed if you have 'sa_role' otherwise the "watermark" will indicate this it's missing and needs to be installed.
  The procedure will not be re-installed every time, it checks for creation time, and will only be re-created when a new version of it is applicable.
- The watermark functionality can now handle multiple rows.
- Also a lot of small changes.

## 2009-11-06

- Automatically open the log viewer when a log message with the severity ERROR or higher is logged.
  LogViewer also remembers the window size and position.
- A new "tab" that shows what tables/columns the optimizer is missing statistics on.
  This needs ASE 15.0.3 ESD#1, and `sp_configure 'capture missing statistics', 1`
  A word of warning so for: The transaction log in the master database will/could fill up due to a bug in ASE where missing statistics on `mon*` tables is updated in `master..sysstatistics`
  A stored procedure `sp_missing_stats`, which (for now) will have to be manually installed before this tab will work...
- Un-selecting rows can now be done in JTables, also the background color could be set with the properties:

      			table.setSelectionBackground={true|false}
      			table.setSelectionBackground.r=intVal
      			table.setSelectionBackground.g=intVal
      			table.setSelectionBackground.b=intVal

- When a database connection is lost, better GUI error handling is applied.
  Meaning show LogViewer, set the watermark to "Not Connected".
- Changes on the Connect-on-startup, now using logic from the ConnectionDialog.
- Also a lot of small changes.

## 2009-05-21 - 2009-11-01

- A long period has passed since I did anything, this was due to I was in an accident where I broke/crushed both my hands/wrists, so I had problems coding...
  But now I'm back again :)

## 2009-05-20

- Changed the Color of the timeLine marker to dark gray.
- Added tick markers on the timeLine slider.
- Separating the TrendGraph's data into TrenGraphDataPoint class
  This makes it possible to save the graph data in it's own table, which makes it easier when reading "off-line" data in a later stage
- Added some AseMon* dictionary tables, which makes it easier when reading "off-line" data in a later stage
- In "off-line" noGui mode, when connecting, try to enable basic monitor settings if not already configured.

## 2009-05-15

- A first version where you can view older Counter Values
  All sampled counters are stored In-Memory, the counters are discarded from memory when "Trend Graph History in Minutes" expires. This means as long as the values are shown in the graph, they stays in memory.
  To enter Navigation mode for viewing the in-memory counters is done by double-click in one of the graphs, or press the "View Counters" in the toolbar. Navigation is done with the slider in the toolbar or by double-click on a interesting point in one of the graphs.
  A vertical line in the graphs represents where we are in the in-memory counters.

## 2009-04-30

- Used defined graphs can now do one trace line for every row.
  The 'graph.type' should then by 'byRow'
  'graph.data.cols' should contain the column name to get value from
  'graph.data.methods' can be 'absVal', 'diffVal' or 'rateVal'. 'graph.data.labels' can be a column name to get value from, or if that name is not found the values for the Primary Key will be used. So if you for example specify '-pk-', which is a unknown column name Then the PK values for that row will be used as the "label" for that line.
- Properties MenuItem on Counter Tab, this so we can see what SQL that is executing when we refresh the Counter Model.
- Wizard for crating User Defined Counters

## 2009-04-09

- Added panel 'Active/Process Statements'.
- Moved monProcessObject from asemon.properties into GetCounters.
- Added a summary page in the offline wizard.
- The offline is started from asemon script using parameters.
  asemon -nogui -config <conffile>
- The offline is completely dependent on this wizard generated config file. (Used to use asemon.properties). The wizard now copies the necessary info from asemon.properties to the generated file.

## 2009-04-08

- New web adress 'www.asemon.se', so references was changed for this
- Started to work on Storing Counter Data from the GUI
  A new Connection dialog has been made... but isn't finished yet. It works to setup a Counter Storage, but it needs more work.
  Offline connect doesn't work yet, I can't yet read stored data and present it in the GUI, thats the next step.

## 2009-03-31

- Checking for updates on the net (but I need to change the web address later)
  But I need to implement the web page for new downloads etc...
- Re-coded MainFrame and moved to GUI
- Trendgraph
  - setChartMaxHistoryTimeInMinutes() could get garbled.
  - Add dummypoint when not connected to avoid NPE from ToolTip. - also moved TrendGraph

## 2009-03-26

- Capture SQL on the right click menu
- Copy table information to clipboard (but: needs more work)
- Changed a bunch of the Icons and added icons to the GTabbedPane, right click menu, goto tab.
- SQL Window can now show graphical showplan views (same as dbisql).
  Some graphical changes as well, print/raiserror messages now comes in-line with the result sets (priviously it was just at the end)
  You can also select cells to copy+paste values from.
  Messages are now also copy+paste enabled.
- Using MigLayout in summary panel for graphs now, which makes it a bit nicer for resizing... the graphs grows in height now as well.
- For the filter "Do not show unchanged counter rows" I added the abbility to dissregard some columns. So even if it's a diff counter and it's NOT zero it will still filtered out that column.
  This is good for "WaitTime" column in the "Processes" tab. Because it's always contains values... I still want to see the diff/rate values. But I don't want to use them (as valid values) in the filter check.
- The filter "Do not show unchanged counter rows" has also been moved from the Options panel to the Filter panel, where it really resides.
  This also made me move the "Counter Type" panel one snap left...
- Selected row in the table is still selected after a "data refresh" and hopefully it's the same row even if it has changed location due to resort of the new/refreshed data...
- MainFrame - status panel (at bottom) now has Memory information
  This class will be needed to recode soon - the code is ugly...
- If data collection is paused, a watermark text will inform you about the Pause...
- The AboutBox panel now contains
  - History
  - Todo
  - System Properties

## 2009-03-16

- Moved the negativeDiffCounters to Zero so we can choose this for each panel....
- Added icons for the TableCntrPanel and most of the CM's
- Some small changes on the xmenu stuff.

## 2009-03-13

- ALOT OF THINGS WHERE DONE
- Moved a lot of files around, the goal is that all GUI components should be in 'gui' package
- Configuration.java: moved to utils package, and added encrypt/decrypt of passwords
- AseMonitoringConfig -> gui.AseMonitoringConfigDialog: remade gui layout
- CountersModel Made it a TableModel... there is a lot more needed to be done on this one and that will be done in next check-in
- A new dictionary for displaying ToolTip on WaitEventId
- Moved Version information into its own class 'Version.java'
- The ConnectionDialog has been totally rewritten
- Auto login ability on startup
- A logAppender for log4j that has a Gui Window so we can look at the errorlog graphically and also change the log level "on the fly", but the log level is not saved into the properties file. We only want to change it during this session.
- Total new Dialog for changing some small properties (only Refresh rate for now)
- A new 'Query window' has been added to the MainFrame menu. This will open a GUI 'isql'
- TabularCntrPanel has been rewritten:
  - The TabbedPane has been rewritten to do "dock/undock" tabs into windows and right click popups on the Tabbs that handles more stuff.
  - now using MigLayout as it's Gui layout manager
  - Using JXTable instead of JTable
  - Sorting is done by JXTable
  - Filtering is done by JXTable
  - Highlighting/Color setting is done by JXTable (in JTable this is CellRenderer)
  - right-click on the table now uses 'xmenu', which is specified in the config file so now it's really easy to add your own right click menu items. Default menu items is 'stored proc text, sp callstack, optdiag, sp_help, sp_spaceused...'
- A bunch of new icons has been added
- AboutBox total rewrite
- And a lot more small stuff
- NOTE: A lot more is needed to be changed and cleanup, so this is just a partial check-in.
- Reine Changed TrendGraph to use JChart2D instead of JFreeChart, this due to performance reasons when we had *long* "Graph History Time". This was merged in from the "trunk".

## 2009-02-12

- Multiple ResultSets is now handled
- Watermark on the summary graphs is now on the scroll panel, this makes the watermark more center of the view/what we see...

## 2009-02-03

- User Defined Graph can be added this probably needs more work, but for now it's "ok"...
- SummaryPanel was "redesigned" and moved to GUI package
- Default ASEMon Icon was changed (added more blue on the table)

## 2009-01-23

- Sometimes that graphs did not get updated in the summary panel. This was a timing problem, when data is captured, it's done with it's own thread. If the "get data" thread was not complete before we wanted to update the graphs, the graphs was not updated. So now I wait for the "get data thread" to complete before continue.
- The Toolbar was added.
- The first glans at "offline setup wizard" was created (need more work here)
- Changed the j4log from 1.2.8 -> 1.2.15
- Some small stuff as well
- Default ASEMon Icon was changed

## 2008-10-31

- Fixed bug in summary panel counte. If ASE listens to several networks only show the first "min()" listener. otherwise the subquery will fail...
- Added Wrap/Scroll capability in the TabPanel

## 2008-10-27

- Fixed bug in engine average calculation... in version X i changed getRateValueAvg to discard 0.0 as "rows" this was to support the Average Service Time in DeviceIO graph better. But now I'm using getRateValueAvgGtZero instead.
- Added the "WATER MARK" text to TabularControlPanel and SummaryPanel to easier know what is happening behind the scenes... are we connected...
- Added some descriptions for Tooltip on the TABS.
- added methods: isMonConnected(), getMonConnection() this will hopefully be used to distinguish between OFF-Line mode and ON-Line mode.

## 2008-10-24

- Added this "version history" comment
- Doing "late initialization" of CountersObject, which means that we can create the GUI graphics and decide later what SQL statement to use dependent on what version the ASE Server is of.
- Took away a lot of static variables in GetCounters and MainFrame

## 2008-10-16

- Major thing is NO-GUI mode is configurable and can persist the counters in a JDBC session. (ASE and H2 has been tested) H2 would be the preferred option. This so we can store the counters in another server/database store than the one we pulling out data from. Using the H2 DB it would also be easier to sample ASE counters on Unix systems and later on view them on a Windows machine.
- some changes to "capture SQL" tool.
- saving more options in the "save props" file!
- And a lot more small things.

## 200x-xx-xx

- Started from asemon 0.96 by Jean-Paul Martin
  Redone a whole lot of things
- Automatic resize of columns headers in tables
- Cell renders are not dependent on Object type, but it's now using method calls to decide what to do when rendering.
- Do not remember all things I did back then