Convert Figma logo to code with AI

antonioribeiro logotracker

Laravel Stats Tracker

2,888
595
2,888
199

Top Related Projects

19,603

Empowering People Ethically with the leading open source alternative to Google Analytics that gives you full control over your data. Matomo lets you easily collect data from websites & apps and visualise this data and extract insights. Privacy is built-in. Liberating Web Analytics. Star us on Github? +1. And we love Pull Requests!

19,637

Simple, open source, lightweight (< 1 KB) and privacy-friendly web analytics alternative to Google Analytics.

7,522

Fathom Lite. Simple, privacy-focused website analytics. Built with Golang & Preact.

20,606

🦔 PostHog provides open-source product analytics, session recording, feature flagging and A/B testing that you can self-host.

The leader in Next-Generation Customer Data Infrastructure

21,874

Umami is a simple, fast, privacy-focused alternative to Google Analytics.

Quick Overview

Tracker is a Laravel package designed for user and event tracking. It provides a comprehensive solution for monitoring user activities, page views, and other events within Laravel applications, offering detailed analytics and reporting capabilities.

Pros

  • Seamless integration with Laravel applications
  • Extensive tracking capabilities, including user sessions, devices, and geolocations
  • Customizable and extendable to fit specific project needs
  • Provides a dashboard for easy visualization of tracked data

Cons

  • May impact application performance if tracking a large number of events
  • Requires additional database storage for tracking data
  • Learning curve for fully utilizing all features and customizations
  • Potential privacy concerns if not configured properly

Code Examples

  1. Basic event tracking:
Tracker::trackEvent(['name' => 'User Registration']);
  1. Tracking a page view:
Tracker::trackVisit(
    $request,
    'Home Page',
    ['custom_property' => 'value']
);
  1. Retrieving tracked data:
$visits = Tracker::sessions(60 * 24); // Get sessions from last 24 hours

Getting Started

  1. Install the package via Composer:

    composer require antonioribeiro/tracker
    
  2. Publish the configuration file:

    php artisan vendor:publish --provider="PragmaRX\Tracker\Vendor\Laravel\ServiceProvider"
    
  3. Run migrations:

    php artisan migrate
    
  4. Add the middleware to your app/Http/Kernel.php:

    protected $middleware = [
        // ...
        \PragmaRX\Tracker\Vendor\Laravel\Middlewares\Tracker::class,
    ];
    
  5. Use the Tracker facade in your application:

    use PragmaRX\Tracker\Vendor\Laravel\Facade as Tracker;
    
    Tracker::trackEvent(['name' => 'My Custom Event']);
    

Competitor Comparisons

19,603

Empowering People Ethically with the leading open source alternative to Google Analytics that gives you full control over your data. Matomo lets you easily collect data from websites & apps and visualise this data and extract insights. Privacy is built-in. Liberating Web Analytics. Star us on Github? +1. And we love Pull Requests!

Pros of Matomo

  • More comprehensive analytics solution with a wide range of features
  • Self-hosted option for better data privacy and control
  • Large community and extensive documentation

Cons of Matomo

  • More complex setup and maintenance
  • Higher resource requirements for hosting

Code Comparison

Matomo (PHP):

$tracker = Matomo\Tracker::make();
$tracker->setUrl('http://example.com');
$tracker->setIp('192.168.0.1');
$tracker->doTrackPageView('Page Title');

Tracker (Laravel):

Tracker::trackVisit([
    'url' => 'http://example.com',
    'client_ip' => '192.168.0.1',
    'page_title' => 'Page Title'
]);

Key Differences

  • Matomo is a full-featured analytics platform, while Tracker is primarily focused on visitor tracking for Laravel applications
  • Matomo offers a user interface for data visualization, whereas Tracker relies on database queries or custom implementations
  • Tracker is more lightweight and easier to integrate into Laravel projects, but with fewer out-of-the-box features compared to Matomo

Use Cases

  • Choose Matomo for comprehensive web analytics needs, especially when data privacy is a concern
  • Opt for Tracker when you need a simple, Laravel-specific tracking solution with minimal overhead

Both projects have their merits, and the choice depends on the specific requirements of your project, such as the desired level of detail in analytics, ease of integration, and available resources for setup and maintenance.

19,637

Simple, open source, lightweight (< 1 KB) and privacy-friendly web analytics alternative to Google Analytics.

Pros of Plausible

  • Lightweight and privacy-focused, with no cookies and GDPR compliance
  • Open-source with a self-hosted option for full data control
  • Simple, intuitive dashboard with easy-to-understand metrics

Cons of Plausible

  • Less detailed tracking capabilities compared to Tracker
  • Limited customization options for advanced users
  • Paid service for hosted version, while Tracker is free

Code Comparison

Plausible (JavaScript snippet):

<script defer data-domain="yourdomain.com" src="https://plausible.io/js/plausible.js"></script>

Tracker (Laravel configuration):

'tracker' => [
    'enabled' => true,
    'log_untracked' => false,
    'log_exceptions' => true,
    'log_routes' => true,
],

Summary

Plausible offers a privacy-focused, lightweight analytics solution with a clean interface, ideal for those prioritizing simplicity and GDPR compliance. Tracker, on the other hand, provides more detailed tracking capabilities and is better suited for Laravel projects requiring in-depth analytics. Plausible's JavaScript implementation is simpler, while Tracker offers more configuration options within Laravel. The choice between the two depends on the specific needs of the project, with Plausible favoring simplicity and privacy, and Tracker offering more comprehensive tracking features.

7,522

Fathom Lite. Simple, privacy-focused website analytics. Built with Golang & Preact.

Pros of Fathom

  • Privacy-focused analytics with GDPR compliance
  • Lightweight and fast, with minimal impact on site performance
  • Simple, clean user interface for easy data interpretation

Cons of Fathom

  • Limited feature set compared to Tracker's extensive capabilities
  • Self-hosted solution requires more setup and maintenance
  • Less flexibility for custom tracking and advanced analytics

Code Comparison

Fathom (JavaScript snippet):

(function(f, a, t, h, o, m){
    a[h]=a[h]||function(){
        (a[h].q=a[h].q||[]).push(arguments)
    };
    o=f.createElement('script'),
    m=f.getElementsByTagName('script')[0];
    o.async=1; o.src=t; o.id='fathom-script';
    m.parentNode.insertBefore(o,m)
})(document, window, '//cdn.usefathom.com/tracker.js', 'fathom');
fathom('set', 'siteId', 'ABCDEF');
fathom('trackPageview');

Tracker (Laravel configuration):

'tracker' => [
    'enabled' => true,
    'log_user_agents' => true,
    'log_devices' => true,
    'log_languages' => true,
    'log_referers' => true,
],

Summary

Fathom offers a privacy-centric, lightweight analytics solution with a user-friendly interface, ideal for those prioritizing simplicity and GDPR compliance. Tracker, on the other hand, provides more comprehensive tracking capabilities and integration with Laravel, suitable for projects requiring detailed analytics and custom tracking options. The choice between the two depends on specific project needs, privacy concerns, and desired level of analytics complexity.

20,606

🦔 PostHog provides open-source product analytics, session recording, feature flagging and A/B testing that you can self-host.

Pros of PostHog

  • More comprehensive analytics platform with features like session recording and feature flags
  • Active development with frequent updates and a larger community
  • Self-hosted option for data privacy and control

Cons of PostHog

  • More complex setup and maintenance due to its broader feature set
  • Higher resource requirements for hosting and running the platform
  • Steeper learning curve for new users

Code Comparison

PostHog (JavaScript):

posthog.capture('button_clicked', { button_color: 'blue' });
posthog.identify('user_id', { email: 'user@example.com' });

Tracker (PHP):

Tracker::trackEvent(['name' => 'button_clicked', 'properties' => ['button_color' => 'blue']]);
Tracker::trackVisit(['user_id' => 'user_id', 'email' => 'user@example.com']);

Key Differences

  • PostHog offers a more modern, JavaScript-based implementation
  • Tracker is primarily PHP-focused, making it better suited for PHP applications
  • PostHog provides a wider range of analytics features beyond basic event tracking
  • Tracker is lighter-weight and may be easier to integrate into existing PHP projects

Both tools serve the purpose of tracking user behavior, but PostHog offers a more comprehensive analytics solution, while Tracker focuses on simpler event tracking primarily for PHP applications.

The leader in Next-Generation Customer Data Infrastructure

Pros of Snowplow

  • More comprehensive and scalable analytics platform
  • Supports a wider range of data collection methods and sources
  • Offers advanced data modeling and enrichment capabilities

Cons of Snowplow

  • More complex setup and maintenance
  • Requires more resources and infrastructure
  • Steeper learning curve for implementation and usage

Code Comparison

Tracker (Laravel):

use PragmaRX\Tracker\Tracker;

$tracker = new Tracker();
$tracker->trackVisit();

Snowplow (JavaScript):

snowplow('trackPageView');
snowplow('trackStructEvent', 'category', 'action', 'label', 'property', 'value');

Summary

Tracker is a Laravel-specific visitor tracking package, while Snowplow is a more extensive, platform-agnostic analytics solution. Tracker is easier to set up and use within Laravel applications, but Snowplow offers greater flexibility and scalability for larger-scale analytics needs. Tracker is suitable for simpler tracking requirements, whereas Snowplow is better suited for complex data analysis and processing across various platforms and data sources.

21,874

Umami is a simple, fast, privacy-focused alternative to Google Analytics.

Pros of Umami

  • Lightweight and privacy-focused, with no cookies and GDPR compliance
  • Modern tech stack (Next.js, React) for better performance and developer experience
  • Self-hosted solution with easy deployment options

Cons of Umami

  • Less comprehensive feature set compared to Tracker
  • Smaller community and potentially slower development pace
  • Limited integrations with other tools and platforms

Code Comparison

Umami (JavaScript):

export async function getWebsiteStats(...) {
  const { startDate, endDate, url } = params;
  const websiteId = await getWebsiteByUuid(website);
  const [pageviews, uniques, bounces, totaltime] = await Promise.all([
    getPageviews(websiteId, startDate, endDate, url),
    // ... more promises
  ]);
  // ... processing and return
}

Tracker (PHP):

public function getAllData()
{
    return $this->getModel()->orderBy('created_at', 'desc')->get();
}

public function getPageViews($minutes, $results)
{
    return $this->getModel()->pageViews($minutes, $results);
}

The code snippets show different approaches to retrieving website statistics. Umami uses modern JavaScript with async/await and Promise.all for concurrent operations, while Tracker employs PHP with Laravel's Eloquent ORM for database queries. Umami's code appears more focused on specific metrics, while Tracker's methods are more generic and extensible.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

Laravel Stats Tracker

Latest Stable Version License Downloads

Tracker gathers a lot of information from your requests to identify and store:

  • Sessions
  • Page Views (hits on routes)
  • Users (logged users)
  • Devices (computer, smartphone, tablet...)
  • Languages (preference, language range)
  • User Devices (by, yeah, storing a cookie on each device)
  • Browsers (Chrome, Mozilla Firefox, Safari, Internet Explorer...)
  • Operating Systems (iOS, Mac OS, Linux, Windows...)
  • Geo Location Data (Latitute, Longitude, Country and City)
  • Routes and all its parameters
  • Events
  • Referers (url, medium, source, search term...)
  • Exceptions/Errors
  • Sql queries and all its bindings
  • Url queries and all its arguments
  • Database connections

Index

Why?

Storing user tracking information, on indexed and normalized database tables, wastes less disk space and ease the extract of valuable information about your application and business.

Usage

As soon as you install and enable it, Tracker will start storing all information you tell it to, then you can in your application use the Tracker Facade to access everything. Here are some of the methods and relationships available:

Current Session/Visitor

$visitor = Tracker::currentSession();

Most of those methods return an Eloquent model or collection, so you can use not only its attributes, but also relational data:

var_dump( $visitor->client_ip );

var_dump( $visitor->device->is_mobile );

var_dump( $visitor->device->platform );

var_dump( $visitor->geoIp->city );

var_dump( $visitor->language->preference );

Sessions (visits)

$sessions = Tracker::sessions(60 * 24); // get sessions (visits) from the past day
foreach ($sessions as $session)
{
    var_dump( $session->user->email );

    var_dump( $session->device->kind . ' - ' . $session->device->platform );

    var_dump( $session->agent->browser . ' - ' . $session->agent->browser_version );

    var_dump( $session->geoIp->country_name );

    foreach ($session->session->log as $log)
    {
    	var_dump( $log->path );
    }
}

Online Users

Brings all online sessions (logged and unlogged users)

$users = Tracker::onlineUsers(); // defaults to 3 minutes

Users

$users = Tracker::users(60 * 24);

User Devices

$users = Tracker::userDevices(60 * 24, $user->id);

Events

$events = Tracker::events(60 * 24);

Errors

$errors = Tracker::errors(60 * 24);

PageViews summary

$pageViews = Tracker::pageViews(60 * 24 * 30);

PageViews By Country summary

$pageViews = Tracker::pageViewsByCountry(60 * 24);

Filter range

You can send timestamp ranges to those methods using the Minutes class:

$range = new Minutes();

$range->setStart(Carbon::now()->subDays(2));

$range->setEnd(Carbon::now()->subDays(1));

Tracker::userDevices($range);

Routes By Name

Having a route of

Route::get('user/{id}', ['as' => 'user.profile', 'use' => 'UsersController@profile']);

You can use this method to select all hits on that particular route and count them using Laravel:

return Tracker::logByRouteName('user.profile')
        ->where(function($query)
        {
            $query
                ->where('parameter', 'id')
                ->where('value', 1);
        })
        ->count();

And if you need count how many unique visitors accessed that route, you can do:

return Tracker::logByRouteName('tracker.stats.log')
        ->where(function($query)
        {
            $query
                ->where('parameter', 'uuid')
                ->where('value', '8b6faf82-00f1-4db9-88ad-32e58cfb4f9d');
        })
        ->select('tracker_log.session_id')
        ->groupBy('tracker_log.session_id')
        ->distinct()
        ->count('tracker_log.session_id');

Screenshots

Visits

visits

Charts

charts

Users

users

Events

events

Errors

errors

Blade Views

The views above are available in this package, but you need to install the sb-admin panel on your public folder, please look at the instructions below.

How data is stored

All tables are prefixed by tracker_, and here's an extract of some of them, showing columns and contents:

sessions

+-----+--------------------------------------+---------+-----------+----------+-----------------+------------+-----------+----------+-------------+
| id  | uuid                                 | user_id | device_id | agent_id | client_ip       | referer_id | cookie_id | geoip_id | language_id |
+-----+--------------------------------------+---------+-----------+----------+-----------------+------------+-----------+----------+-------------+
| 1   | 09465be3-5930-4581-8711-5161f62c4373 | 1       | 1         | 1        | 186.228.127.245 | 2          | 1         | 2        | 3           |
| 2   | 07399969-0a19-47f0-862d-43b06d7cde45 |         | 2         | 2        | 66.240.192.138  |            | 2         | 2        | 2           |
+-----+--------------------------------------+---------+-----------+----------+-----------------+------------+-----------+----------+-------------+

devices

+----+----------+-------------+-------------+------------------+-----------+
| id | kind     | model       | platform    | platform_version | is_mobile |
+----+----------+-------------+-------------+------------------+-----------+
| 1  | Computer | unavailable | Windows 8   |                  |           |
| 2  | Tablet   | iPad        | iOS         | 7.1.1            | 1         |
| 3  | Computer | unavailable | Windows XP  |                  |           |
| 5  | Computer | unavailable | Other       |                  |           |
| 6  | Computer | unavailable | Windows 7   |                  |           |
| 7  | Computer | unavailable | Windows 8.1 |                  |           |
| 8  | Phone    | iPhone      | iOS         | 7.1              | 1         |
+----+----------+-------------+-------------+------------------+-----------+

agents

+----+-----------------------------------------------------------------------------------------------------------------------------------------+-------------------+-----------------+
| id | name                                                                                                                                    | browser           | browser_version |
+----+-----------------------------------------------------------------------------------------------------------------------------------------+-------------------+-----------------+
| 1  | Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36                           | Chrome            | 35.0.1916       |
| 2  | Mozilla/5.0 (iPad; CPU OS 7_1_1 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/34.0.1847.18 Mobile/11D201 Safari/9537.53 | Chrome Mobile iOS | 34.0.1847       |
| 3  | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)                                                                                      | IE                | 6.0             |
| 4  | Python-urllib/2.6                                                                                                                       | Other             |                 |
| 5  | Other                                                                                                                                   | Other             |                 |
| 6  | Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36                           | Chrome            | 34.0.1847       |
| 7  | Mozilla/5.0 (Windows NT 6.3; rv:28.0) Gecko/20100101 Firefox/28.0                                                                       | Firefox           | 28.0            |
| 8  | Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D169 Safari/9537.53 | Mobile Safari     | 7.0             |
+----+-----------------------------------------------------------------------------------------------------------------------------------------+-------------------+-----------------+

languages

+----+------------+----------------+
| id | preference | language_range |
+----+------------+----------------+
| 1  | en         | ru=0.8,es=0.5  |
| 2  | es         | en=0.7,ru=0.3  |
| 3  | ru         | en=0.5,es=0.5  |
+----+------------+----------------+

domains

+----+--------------------------+
| id | name                     |
+----+--------------------------+
| 1  | antoniocarlosribeiro.com |
+----+--------------------------+

errors

+----+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | code | message                                                                                                                                                                                                                      |
+----+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1  | 404  |                                                                                                                                                                                                                              |
| 2  | 500  | Call to undefined method PragmaRX\Tracker\Tracker::sessionLog()                                                                                                                                                              |
| 3  | 500  | Trying to get property of non-object (View: /home/forge/stage.antoniocarlosribeiro.com/app/views/admin/tracker/log.blade.php)                                                                                                |
| 4  | 500  | syntax error, unexpected 'foreach' (T_FOREACH)                                                                                                                                                                               |
| 5  | 500  | Call to undefined method PragmaRX\Tracker\Tracker::pageViewsByCountry()                                                                                                                                                      |
| 6  | 500  | Class PragmaRX\Firewall\Vendor\Laravel\Artisan\Base contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Illuminate\Console\Command::fire)                                 |
| 7  | 405  |                                                                                                                                                                                                                              |
| 8  | 500  | Trying to get property of non-object                                                                                                                                                                                         |
| 9  | 500  | Missing argument 2 for Illuminate\Database\Eloquent\Model::setAttribute(), called in /home/forge/stage.antoniocarlosribeiro.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 2444 and defined |
+----+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

events

+----+------------------------------------------------+
| id | name                                           |
+----+------------------------------------------------+
| 1  | illuminate.log                                 |
| 2  | router.before                                  |
| 3  | router.matched                                 |
| 4  | auth.attempt                                   |
| 5  | auth.login                                     |
| 6  | composing: admin.tracker.index                 |
| 7  | creating: admin.tracker._partials.menu         |
| 8  | composing: admin.tracker._partials.menu        |
| 9  | creating: admin.layout                         |
| 10 | composing: admin.layout                        |
| 11 | creating: admin._partials.mainMenu             |
| 12 | composing: admin._partials.mainMenu            |
| 13 | creating: admin._partials.messages             |
| 14 | composing: admin._partials.messages            |
| 15 | creating: global._partials.google-analytics    |
| 16 | composing: global._partials.google-analytics   |
+----+------------------------------------------------+

geoip

+----+----------+-----------+--------------+---------------+---------------------------+--------+----------------+-------------+-----------+----------+------------+----------------+
| id | latitude | longitude | country_code | country_code3 | country_name              | region | city           | postal_code | area_code | dma_code | metro_code | continent_code |
+----+----------+-----------+--------------+---------------+---------------------------+--------+----------------+-------------+-----------+----------+------------+----------------+
| 1  | 37.4192  | -122.057  | US           | USA           | United States             | CA     | Mountain View  | 94043       | 650       | 807      | 807        | NA             |
| 2  | -10      | -55       | BR           | BRA           | Brazil                    |        |                |             |           |          |            | SA             |
| 3  | 30.3909  | -86.3161  | US           | USA           | United States             | FL     | Miramar Beach  | 32550       | 850       | 686      | 686        | NA             |
| 4  | 38.65    | -90.5334  | US           | USA           | United States             | MO     | Chesterfield   | 63017       | 314       | 609      | 609        | NA             |
| 5  | 42.7257  | -84.636   | US           | USA           | United States             | MI     | Lansing        | 48917       | 517       | 551      | 551        | NA             |
| 6  | 42.8884  | -78.8761  | US           | USA           | United States             | NY     | Buffalo        | 14202       | 716       | 514      | 514        | NA             |
| 7  | 40.1545  | -75.3809  | US           | USA           | United States             | PA     | Norristown     | 19403       | 610       | 504      | 504        | NA             |
| 8  | 47.4891  | -122.291  | US           | USA           | United States             | WA     | Seattle        | 98168       | 206       | 819      | 819        | NA             |
| 9  | 33.7516  | -84.3915  | US           | USA           | United States             | GA     | Atlanta        | 30303       | 404       | 524      | 524        | NA             |
| 10 | 33.7633  | -117.794  | US           | USA           | United States             | CA     | Santa Ana      | 92705       | 714       | 803      | 803        | NA             |
| 11 | 33.4357  | -111.917  | US           | USA           | United States             | AZ     | Tempe          | 85281       | 480       | 753      | 753        | NA             |
| 12 | 40.7421  | -74.0018  | US           | USA           | United States             | NY     | New York       | 10011       | 212       | 501      | 501        | NA             |
| 13 | 28.6185  | -81.4336  | US           | USA           | United States             | FL     | Orlando        | 32810       | 407       | 534      | 534        | NA             |
| 14 | 38.6312  | -90.1922  | US           | USA           | United States             | MO     | Saint Louis    | 63101       | 314       | 609      | 609        | NA             |
| 15 | 51       | 9         | DE           | DEU           | Germany                   |        |                |             |           |          |            | EU             |
| 16 | 52.5     | 5.75      | NL           | NLD           | Netherlands               |        |                |             |           |          |            | EU             |
| 17 | 48.86    | 2.35      | FR           | FRA           | France                    |        |                |             |           |          |            | EU             |
| 18 | 60       | 100       | RU           | RUS           | Russian Federation        |        |                |             |           |          |            | EU             |
| 19 | 51.5     | -0.13     | GB           | GBR           | United Kingdom            |        |                |             |           |          |            | EU             |
| 20 | 42.8333  | 12.8333   | IT           | ITA           | Italy                     |        |                |             |           |          |            | EU             |
| 21 | 59.3333  | 18.05     | SE           | SWE           | Sweden                    | 26     | Stockholm      |             |           |          |            | EU             |
| 22 | -41      | 174       | NZ           | NZL           | New Zealand               |        |                |             |           |          |            | OC             |
| 23 | 37.57    | 126.98    | KR           | KOR           | Korea, Republic of        |        |                |             |           |          |            | AS             |
| 24 | 1.3667   | 103.8     | SG           | SGP           | Singapore                 |        |                |             |           |          |            | AS             |
| 25 | -43.5333 | 172.633   | NZ           | NZL           | New Zealand               | E9     | Christchurch   | 8023        |           |          |            | OC             |
| 26 | -27.471  | 153.024   | AU           | AUS           | Australia                 | 04     | Brisbane       |             |           |          |            | OC             |
| 27 | 26.9167  | 75.8167   | IN           | IND           | India                     | 24     | Jaipur         |             |           |          |            | AS             |
| 28 | 32       | 53        | IR           | IRN           | Iran, Islamic Republic of |        |                |             |           |          |            | AS             |
| 29 | 32.0617  | 118.778   | CN           | CHN           | China                     | 04     | Nanjing        |             |           |          |            | AS             |
| 30 | -22.9    | -47.0833  | BR           | BRA           | Brazil                    | 27     | Campinas       |             |           |          |            | SA             |
| 31 | 32.8073  | -117.132  | US           | USA           | United States             | CA     | San Diego      | 92123       | 858       | 825      | 825        | NA             |
| 32 | -22.9    | -43.2333  | BR           | BRA           | Brazil                    | 21     | Rio De Janeiro |             |           |          |            | SA             |
+----+----------+-----------+--------------+---------------+---------------------------+--------+----------------+-------------+-----------+----------+------------+----------------+

log

+-----+------------+---------+----------+--------+---------------+---------+-----------+---------+------------+----------+
| id  | session_id | path_id | query_id | method | route_path_id | is_ajax | is_secure | is_json | wants_json | error_id |
+-----+------------+---------+----------+--------+---------------+---------+-----------+---------+------------+----------+
| 1   | 1          | 1       |          | GET    | 1             |         | 1         |         |            |          |
| 2   | 1          | 2       |          | GET    | 2             |         | 1         |         |            |          |
| 3   | 1          | 3       |          | GET    | 3             |         | 1         |         |            |          |
| 4   | 1          | 3       |          | POST   | 4             |         | 1         |         |            |          |
+-----+------------+---------+----------+--------+---------------+---------+-----------+---------+------------+----------+

paths

+----+--------------------------------------------------------+
| id | path                                                   |
+----+--------------------------------------------------------+
| 1  | /                                                      |
| 2  | admin                                                  |
| 3  | login                                                  |
| 4  | admin/languages                                        |
| 5  | admin/tracker                                          |
| 6  | admin/pages                                            |
| 7  | jmx-console                                            |
| 8  | manager/html                                           |
| 9  | administrator                                          |
| 10 | joomla/administrator                                   |
| 11 | cms/administrator                                      |
| 12 | Joomla/administrator                                   |
| 13 | phpmyadmin                                             |
| 14 | phpMyAdmin                                             |
| 15 | mysql                                                  |
| 16 | sql                                                    |
| 17 | myadmin                                                |
| 18 | webdav                                                 |
+----+--------------------------------------------------------+

route_paths

+----+----------+--------------------------------------------------------+
| id | route_id | path                                                   |
+----+----------+--------------------------------------------------------+
| 1  | 1        | /                                                      |
| 2  | 2        | admin                                                  |
| 3  | 3        | login                                                  |
| 4  | 4        | login                                                  |
| 5  | 5        | admin/languages                                        |
| 6  | 6        | admin/tracker                                          |
| 7  | 7        | admin/pages                                            |
+----+----------+--------------------------------------------------------+

routes

+----+--------------------------------------+----------------------------------------------------------+
| id | name                                 | action                                                   |
+----+--------------------------------------+----------------------------------------------------------+
| 1  | home                                 | ACR\Controllers\Home@index                               |
| 2  | admin                                | ACR\Controllers\Admin\Admin@index                        |
| 3  | login.form                           | ACR\Controllers\Logon@form                               |
| 4  | login.do                             | ACR\Controllers\Logon@login                              |
| 5  | admin.languages.index                | ACR\Controllers\Admin\Languages@index                    |
| 6  | admin.tracker.index                  | ACR\Controllers\Admin\Tracker@index                      |
| 7  | admin.pages.index                    | ACR\Controllers\Admin\Pages@index                        |
| 8  | admin.tracker.log                    | ACR\Controllers\Admin\Tracker@log                        |
| 9  | technology                           | ACR\Controllers\Technology@index                         |
| 10 | technology.articles.show             | ACR\Controllers\Technology@show                          |
| 11 | language.select                      | ACR\Controllers\Language@select                          |
| 12 | admin.tracker.summary                | ACR\Controllers\Admin\Tracker@summary                    |
| 13 | admin.tracker.api.pageviews          | ACR\Controllers\Admin\Tracker@apiPageviews               |
| 14 | admin.tracker.api.pageviewsbycountry | ACR\Controllers\Admin\Tracker@apiPageviewsByCountry      |
| 15 | admin.pages.create                   | ACR\Controllers\Admin\Pages@create                       |
| 16 | api.markdown                         | ACR\Controllers\Api@markdown                             |
| 17 | admin.pages.store                    | ACR\Controllers\Admin\Pages@store                        |
| 18 | bio                                  | ACR\Controllers\StaticPages@show                         |
| 19 | logout.do                            | ACR\Controllers\Logon@logout                             |
| 20 | admin.tracker.index                  | ACR\Controllers\Admin\UsageTracker@index                 |
| 21 | admin.tracker.api.pageviewsbycountry | ACR\Controllers\Admin\UsageTracker@apiPageviewsByCountry |
| 22 | admin.tracker.api.pageviews          | ACR\Controllers\Admin\UsageTracker@apiPageviews          |
+----+--------------------------------------+----------------------------------------------------------+

sql_queries ;

+----+------------------------------------------+-------------------------------------------------------------------------------------------------+-------+---------------+
| id | sha1                                     | statement                                                                                       | time  | connection_id |
+----+------------------------------------------+-------------------------------------------------------------------------------------------------+-------+---------------+
| 1  | 5aee121018ac16dbf26dbbe0cf35fd44a29a5d7e | select * from "users" where "id" = ? limit 1                                                    | 3.13  | 1             |
| 2  | 0fc3f3a722b0f9ef38e6bee44fc3fde9fb1fd1d9 | select "created_at" from "articles" where "published_at" is not null order by "created_at" desc | 1.99  | 1             |
+----+------------------------------------------+-------------------------------------------------------------------------------------------------+-------+---------------+

Manually log things

If your application has special needs, you can manually log things like:

Events

Tracker::trackEvent(['event' => 'cart.add']);
Tracker::trackEvent(['event' => 'cart.add', 'object' => 'App\Cart\Events\Add']);

Routes

Tracker::trackVisit(
    [
        'name' => 'my.dynamic.route.name',
        'action' => 'MyDynamic@url'
    ],
    ['path' => 'my/dynamic/url']
);

Requirements

  • Laravel 5+
  • PHP 5.3.7+
  • Package "geoip/geoip":"~1.14" or "geoip2/geoip2":"~2.0" (If you are planning to store Geo IP information)

For Laravel 4+ please use version 2.0.10.

Installing

Require the tracker package by executing the following command in your command line:

composer require pragmarx/tracker

Add the service provider to your app/config/app.php:

 PragmaRX\Tracker\Vendor\Laravel\ServiceProvider::class,

Add the alias to the facade on your app/config/app.php:

'Tracker' => 'PragmaRX\Tracker\Vendor\Laravel\Facade',

Publish tracker configuration:

Laravel 4

php artisan config:publish pragmarx/tracker

Laravel 5

php artisan vendor:publish --provider="PragmaRX\Tracker\Vendor\Laravel\ServiceProvider"

Enable the Middleware (Laravel 5)

Open the newly published config file found at app/config/tracker.php and enable use_middleware:

'use_middleware' => true,

Add the Middleware to Laravel Kernel (Laravel 5)

Open the file app/Http/Kernel.php and add the following to your web middlewares:

\PragmaRX\Tracker\Vendor\Laravel\Middlewares\Tracker::class,

Enable Tracker in your config.php (Laravel 4) or tracker.php (Laravel 5)

'enabled' => true,

Publish the migration

php artisan tracker:tables

This is only needed if you are on Laravel 4, because vendor:publish does it for you in Laravel 5.

Create a database connection for it on your config/database.php

'connections' => [
    'mysql' => [
        ...
    ],
    
    'tracker' => [
    	'driver'   => '...',
    	'host'     => '...',
    	'database' => ...,
        'strict' => false,    // to avoid problems on some MySQL installs
    	...
    ],
],

Migrate it

If you have set the default connection to tracker, you can

php artisan migrate

Otherwise you'll have to

php artisan migrate --database=tracker

If you are planning to store Geo IP information, also install the geoip package:

composer require "geoip/geoip":"~1.14"

or

composer require "geoip2/geoip2":"~2.0"

And make sure you don't have the PHP module installed. This is a Debian/Ubuntu example:

sudo apt-get purge php5-geoip

Everything Is Disabled By Default

Tracker has a lot of logging options, but you need to decide what you want to log. Starting by enabling this one:

'log_enabled' => true,

It is responsible for logging page hits and sessions, basically the client IP address.

Multiple authentication drivers

You just have to all your auth IOC bidings to the array:

'authentication_ioc_binding' => ['auth', 'admin'],

Stats Panel

To use the stats panel on your website you'll need to download the sb-admin 2 sources to your public folder:

git clone https://github.com/BlackrockDigital/startbootstrap-sb-admin-2.git public/templates/sb-admin-2
cd public/templates/sb-admin-2
git checkout tags/v3.3.7+1
git checkout -b v3.3.7+1

And enabled in your config file:

'stats_panel_enabled' => true,

Set the web middleware for stats routes (Laravel 5)

'stats_routes_middleware' => 'web',

Only admins can view the stats, so if you don't have an is_admin attribute on your user model, you'll have to add one:

public function getIsAdminAttribute()
{
    return true;
}

It can be 'admin', 'is_admin', 'root' or 'is_root'.

Troubleshooting

Is everything enabled?

Make sure Tracker is enabled in the config file. Usually this is the source of most problems.

Tail your laravel.log file

tail -f storage/logs/laravel.log

Usually non-trackable IP addresses and other messages will appear in the log:

[2018-03-19 21:28:08] local.WARNING: TRACKER (unable to track item): 127.0.0.1 is not trackable.

SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'field name'

This is probably related to SQL modes on MySQL, specifically with NO_ZERO_IN_DATE and NO_ZERO_DATE modes:

https://stackoverflow.com/questions/36882149/error-1067-42000-invalid-default-value-for-created-at

Because Laravel's defaults to

set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

You may need to change your Tracker database connection configuration to

'connections' => [
    ...

    'tracker' => [
        ...

        'strict'    => false,
    ],
],

Not able to track users?

If you get an error like:

Base table or view not found: 1146 Table 'tracker.users' doesn't exist

You probably need to change:

'user_model' => 'PragmaRX\Tracker\Vendor\Laravel\Models\User',

To create (or use a current) a User model:

'user_model' => 'App\TrackerUser',

And configure the Connection related to your users table:

protected $connection = 'mysql';

Not able to track API's?

In your kernel

protected $middlewareGroups = [
    'web' => [
        .......
        \PragmaRX\Tracker\Vendor\Laravel\Middlewares\Tracker::class,
    ],

    'api' => [
       .......
        \PragmaRX\Tracker\Vendor\Laravel\Middlewares\Tracker::class,
    ],
];

Author

Antonio Carlos Ribeiro All Contributors

License

Tracker is licensed under the BSD 3-Clause License - see the LICENSE file for details

Contributing

Pull requests and issues are more than welcome.