From 8c9a8b9f924f4b2764f7a5edb1bfd99430a68359 Mon Sep 17 00:00:00 2001 From: Sina Kashipazha Date: Tue, 17 Aug 2021 13:55:15 +0000 Subject: [PATCH] Added remote logging capability to virtual router, console proxy ,and secondary storage. --- .../consoleproxy/ConsoleProxyManager.java | 6 ++++++ .../consoleproxy/ConsoleProxyManagerImpl.java | 6 +++++- .../router/VirtualNetworkApplianceManager.java | 6 ++++++ .../VirtualNetworkApplianceManagerImpl.java | 7 ++++++- .../SecondaryStorageManagerImpl.java | 10 +++++++++- systemvm/debian/etc/rsyslog.d/49-cloud.conf | 8 ++++++++ systemvm/debian/etc/rsyslog.d/49-haproxy.conf | 12 ++++++++++++ systemvm/debian/opt/cloud/bin/setup/common.sh | 6 ++++++ .../debian/opt/cloud/bin/setup/postinit.sh | 18 ++++++++++++++++++ 9 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 systemvm/debian/etc/rsyslog.d/49-cloud.conf create mode 100644 systemvm/debian/etc/rsyslog.d/49-haproxy.conf diff --git a/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManager.java b/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManager.java index f7f88b0da66e..f0035c9f07d5 100644 --- a/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManager.java +++ b/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManager.java @@ -44,6 +44,12 @@ public interface ConsoleProxyManager extends Manager, ConsoleProxyService { public static final ConfigKey NoVncConsoleSourceIpCheckEnabled = new ConfigKey("Advanced", Boolean.class, "novnc.console.sourceip.check.enabled", "false", "If true, The source IP to access novnc console must be same as the IP in request to management server for console URL. Needs to reconnect CPVM to management server when this changes (via restart CPVM, or management server, or cloud service in CPVM)", false); + static final ConfigKey ConsoleProxyRemoteLoggingEnabled = new ConfigKey<>("Advanced", Boolean.class, "consoleproxy.remote.logging.enabled", "false", + "If true, console proxy will forward console proxy logs to ", true, ConfigKey.Scope.Global); + + static final ConfigKey ConsoleProxyRemoteLoggingAddress = new ConfigKey<>("Advanced", String.class, "consoleproxy.remote.logging.address", "", + "Console proxy forwards its logs to this address", true, ConfigKey.Scope.Global); + public void setManagementState(ConsoleProxyManagementState state); public ConsoleProxyManagementState getManagementState(); diff --git a/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 6cc0ace1e056..0462bcdf4dc9 100644 --- a/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -1219,6 +1219,9 @@ public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, Depl } buf.append(" zone=").append(dest.getDataCenter().getId()); buf.append(" pod=").append(dest.getPod().getId()); + buf.append(" remoteloggingenabled=").append(ConsoleProxyRemoteLoggingEnabled.value()); + buf.append(" remoteloggingaddress=").append(ConsoleProxyRemoteLoggingAddress.value()); + buf.append(" guid=Proxy.").append(profile.getId()); buf.append(" proxy_vm=").append(profile.getId()); if (disableRpFilter) { @@ -1580,7 +1583,8 @@ public String getConfigComponentName() { @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[] { NoVncConsoleDefault, NoVncConsoleSourceIpCheckEnabled }; + return new ConfigKey[] { NoVncConsoleDefault, NoVncConsoleSourceIpCheckEnabled, + ConsoleProxyRemoteLoggingEnabled, ConsoleProxyRemoteLoggingAddress }; } protected ConsoleProxyStatus parseJsonToConsoleProxyStatus(String json) throws JsonParseException { diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java index 18f669ee91b3..4f724e125c5c 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java @@ -114,6 +114,12 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA static final ConfigKey RouterHealthChecksMaxMemoryUsageThreshold = new ConfigKey(Double.class, "router.health.checks.max.memory.usage.threshold", "Advanced", "100", "Max Memory Usage threshold as % above which check is considered a failure.", true, ConfigKey.Scope.Zone, null); + static final ConfigKey RouterRemoteLoggingEnabled = new ConfigKey<>(Boolean.class, "router.remote.logging.enabled", + "Advanced", "false", "If true, Router VM will forward console proxy logs to ", + true, ConfigKey.Scope.Zone, null); + static final ConfigKey RouterRemoteLoggingAddress = new ConfigKey<>(String.class, "router.remote.logging.address", + "Advanced", "", "Router VMs forward their logs to this address", + true, ConfigKey.Scope.Zone, null); public static final int DEFAULT_ROUTER_VM_RAMSIZE = 256; // 256M public static final int DEFAULT_ROUTER_CPU_MHZ = 500; // 500 MHz diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 893ac58fba83..3c5943f5a6ac 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -2050,6 +2050,9 @@ public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile buf.append(" type=" + type + rpFilter); + buf.append(" remoteloggingenabled=").append(RouterRemoteLoggingEnabled.value()); + buf.append(" remoteloggingaddress=").append(RouterRemoteLoggingAddress.value()); + final String domain_suffix = dc.getDetail(ZoneConfig.DnsSearchOrder.getName()); if (domain_suffix != null) { buf.append(" dnssearchorder=").append(domain_suffix); @@ -3239,7 +3242,9 @@ public ConfigKey[] getConfigKeys() { RouterHealthChecksFreeDiskSpaceThreshold, RouterHealthChecksMaxCpuUsageThreshold, RouterHealthChecksMaxMemoryUsageThreshold, - ExposeDnsAndBootpServer + ExposeDnsAndBootpServer, + RouterRemoteLoggingEnabled, + RouterRemoteLoggingAddress }; } diff --git a/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java b/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java index f7c22c209852..8c5bacfdab22 100644 --- a/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java +++ b/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java @@ -266,6 +266,12 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar static final ConfigKey MaxNumberOfSsvmsForMigration = new ConfigKey("Advanced", Integer.class, "max.ssvm.count", "5", "Number of additional SSVMs to handle migration of data objects concurrently", true, ConfigKey.Scope.Global); + static final ConfigKey SecondaryStorageRemoteLoggingEnabled = new ConfigKey<>( "Advanced", Boolean.class,"secondary.storage.remote.logging.enabled", "false", + "If true, secondary storage will forward secondary storage logs to ", false, ConfigKey.Scope.Global); + + static final ConfigKey SecondaryStorageRemoteLoggingAddress = new ConfigKey<>( "secondary.storage.remote.logging.address", String.class, "Advanced", "", + "Secondary storage forwards its logs to this address", true, ConfigKey.Scope.Global); + public SecondaryStorageManagerImpl() { } @@ -1080,6 +1086,8 @@ public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, Depl buf.append(" zone=").append(dest.getDataCenter().getId()); buf.append(" pod=").append(dest.getPod().getId()); + buf.append(" remoteloggingenabled=").append(SecondaryStorageRemoteLoggingEnabled.value()); + buf.append(" remoteloggingaddress=").append(SecondaryStorageRemoteLoggingAddress.value()); buf.append(" guid=").append(profile.getVirtualMachine().getHostName()); @@ -1420,7 +1428,7 @@ public String getConfigComponentName() { @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[] {NTPServerConfig, MaxNumberOfSsvmsForMigration}; + return new ConfigKey[] {NTPServerConfig, MaxNumberOfSsvmsForMigration, SecondaryStorageRemoteLoggingEnabled, SecondaryStorageRemoteLoggingAddress}; } } diff --git a/systemvm/debian/etc/rsyslog.d/49-cloud.conf b/systemvm/debian/etc/rsyslog.d/49-cloud.conf new file mode 100644 index 000000000000..c62f799cb651 --- /dev/null +++ b/systemvm/debian/etc/rsyslog.d/49-cloud.conf @@ -0,0 +1,8 @@ +$InputFileName /var/log/cloud.log +$InputFileTag cloud +$InputFileStateFile stat-file1-cloud +$InputFileSeverity info +$InputFileFacility local7 +$InputFilePollInterval 1 +$InputFilePersistStateInterval 1 +$InputRunFileMonitor \ No newline at end of file diff --git a/systemvm/debian/etc/rsyslog.d/49-haproxy.conf b/systemvm/debian/etc/rsyslog.d/49-haproxy.conf new file mode 100644 index 000000000000..87dee6532fe3 --- /dev/null +++ b/systemvm/debian/etc/rsyslog.d/49-haproxy.conf @@ -0,0 +1,12 @@ +# Create an additional socket in haproxy's chroot in order to allow logging via +# /dev/log to chroot'ed HAProxy processes +$AddUnixListenSocket /var/lib/haproxy/dev/log + +$InputFileName /var/log/haproxy.log +$InputFileTag haproxy +$InputFileStateFile stat-file1-haproxy +$InputFileSeverity info +$InputFileFacility local7 +$InputFilePollInterval 1 +$InputFilePersistStateInterval 1 +$InputRunFileMonitor \ No newline at end of file diff --git a/systemvm/debian/opt/cloud/bin/setup/common.sh b/systemvm/debian/opt/cloud/bin/setup/common.sh index 987f07d7659d..68a91959b525 100755 --- a/systemvm/debian/opt/cloud/bin/setup/common.sh +++ b/systemvm/debian/opt/cloud/bin/setup/common.sh @@ -759,6 +759,12 @@ parse_cmd_line() { ntpserverlist) export NTP_SERVER_LIST=$VALUE ;; + remoteloggingenabled) + export REMOTE_LOGGGING_ENABLED=$VALUE + ;; + remoteloggingaddress) + export REMOTE_LOGGGING_ADDRESS=$VALUE + ;; esac done echo -e "\n\t}\n}" >> ${CHEF_TMP_FILE} diff --git a/systemvm/debian/opt/cloud/bin/setup/postinit.sh b/systemvm/debian/opt/cloud/bin/setup/postinit.sh index 5e7e4c01a228..08aef7bbdf29 100755 --- a/systemvm/debian/opt/cloud/bin/setup/postinit.sh +++ b/systemvm/debian/opt/cloud/bin/setup/postinit.sh @@ -20,10 +20,28 @@ # Eject cdrom if any eject || true +. /opt/cloud/bin/setup/common.sh + +setup_remote_logging(){ + echo "${REMOTE_LOGGGING_ENABLED,,}" + # Remove curent configuration + sed -i '/imudp/d' /etc/rsyslog.conf + sed -i '/3914/d' /etc/rsyslog.conf + if [[ "${REMOTE_LOGGGING_ENABLED,,}" == "true" ]]; then + sed -i '/^# provides UDP syslog*/a $ModLoad imudp\n$UDPServerRun 3914' /etc/rsyslog.conf + fi + + echo "*.* @${REMOTE_LOGGGING_ADDRESS}" > /etc/rsyslog.d/99-fwd.conf + + systemctl restart rsyslog +} # Restart journald for setting changes to apply systemctl restart systemd-journald +# Setup remote logging +setup_remote_logging + TYPE=$(grep -Po 'type=\K[a-zA-Z]*' /var/cache/cloud/cmdline) if [ "$TYPE" == "router" ] || [ "$TYPE" == "vpcrouter" ] || [ "$TYPE" == "dhcpsrvr" ] then