1 
2 /**
3  *    Copyright (C) 2018-present MongoDB, Inc.
4  *
5  *    This program is free software: you can redistribute it and/or modify
6  *    it under the terms of the Server Side Public License, version 1,
7  *    as published by MongoDB, Inc.
8  *
9  *    This program is distributed in the hope that it will be useful,
10  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *    Server Side Public License for more details.
13  *
14  *    You should have received a copy of the Server Side Public License
15  *    along with this program. If not, see
16  *    <http://www.mongodb.com/licensing/server-side-public-license>.
17  *
18  *    As a special exception, the copyright holders give permission to link the
19  *    code of portions of this program with the OpenSSL library under certain
20  *    conditions as described in each individual source file and distribute
21  *    linked combinations including the program with the OpenSSL library. You
22  *    must comply with the Server Side Public License in all respects for
23  *    all of the code used other than as permitted herein. If you modify file(s)
24  *    with this exception, you may extend this exception to your version of the
25  *    file(s), but you are not obligated to do so. If you do not wish to do so,
26  *    delete this exception statement from your version. If you delete this
27  *    exception statement from all source files in the program, then also delete
28  *    it in the license file.
29  */
30 
31 #pragma once
32 
33 #include "mongo/base/disallow_copying.h"
34 #include "mongo/db/concurrency/deferred_writer.h"
35 #include "mongo/db/service_context.h"
36 
37 namespace mongo {
38 
39 class HealthLogEntry;
40 
41 /**
42  * The interface to the local healthlog.
43  *
44  * This class contains facilities for creating and asynchronously writing to the local healthlog
45  * collection.  There should only be one instance of this class, initialized on startup and cleaned
46  * up on shutdown.
47  */
48 class HealthLog {
49     MONGO_DISALLOW_COPYING(HealthLog);
50 
51 public:
52     /**
53      * Required to use HealthLog as a ServiceContext decorator.
54      *
55      * Should not be used anywhere else.
56      */
57     HealthLog();
58 
59     /**
60      * The maximum size of the in-memory buffer of health-log entries, in bytes.
61      */
62     static const int64_t kMaxBufferSize = 25'000'000;
63 
64     /**
65      * Start the worker thread writing the buffer to the collection.
66      */
67     void startup(void);
68 
69     /**
70      * Stop the worker thread.
71      */
72     void shutdown(void);
73 
74     /**
75      * The name of the collection.
76      */
77     static const NamespaceString nss;
78 
79     /**
80      * Get the current context's HealthLog.
81      */
82     static HealthLog& get(ServiceContext* ctx);
83     static HealthLog& get(OperationContext* ctx);
84 
85     /**
86      * Asynchronously insert the given entry.
87      *
88      * Return `false` iff there is no more space in the buffer.
89      */
90     bool log(const HealthLogEntry& entry);
91 
92 private:
93     DeferredWriter _writer;
94 };
95 }
96